From 33455e4812169835c0c0fe6ba602e6d211700ece Mon Sep 17 00:00:00 2001
From: mio <stigma@disroot.org>
Date: Tue, 4 Feb 2025 12:52:23 +1000
Subject: tdehw: Check /usr/lib/NetworkManager for VPN service definitions.

It's not exactly clear when this change occurred, but the VPN service
definitions (plugins) can now be stored in /usr/lib/NetworkManager.
The old path is still searched to keep compatibility.

This fixes TDE/tdenetworkmanager#5 which details how TDENetworkManager
is unable to find any VPN plugins despite them being installed and
accessible from other NM applets.

Signed-off-by: mio <stigma@disroot.org>
---
 .../network-manager/network-manager.cpp            | 59 ++++++++++++----------
 .../network-manager/network-manager.h              |  3 +-
 2 files changed, 34 insertions(+), 28 deletions(-)

(limited to 'tdecore')

diff --git a/tdecore/tdehw/networkbackends/network-manager/network-manager.cpp b/tdecore/tdehw/networkbackends/network-manager/network-manager.cpp
index 754fd31b8..f41f5cbc8 100644
--- a/tdecore/tdehw/networkbackends/network-manager/network-manager.cpp
+++ b/tdecore/tdehw/networkbackends/network-manager/network-manager.cpp
@@ -1922,7 +1922,7 @@ void TDENetworkConnectionManager_BackendNM::loadConnectionInformation() {
 				}
 
 #ifdef DEBUG_NETWORK_MANAGER_COMMUNICATIONS
-				printf("[network-manager comm debug] %s\n", (*it).data()); fflush(stdout);
+				printf("[network-manager comm debug] %s\n", (*it).local8Bit().data()); fflush(stdout);
 #endif // DEBUG_NETWORK_MANAGER_COMMUNICATIONS
 
 				// Obtain connection settings from the path specified
@@ -4941,34 +4941,39 @@ TDENetworkVPNTypeList TDENetworkConnectionManager_BackendNM::availableVPNTypes()
 	TDENetworkVPNTypeList ret;
 
 	// Query NetworkManager to verify plugin availability before claiming support for a VPN type
-	TQDir serviceDir(NM_PLUGIN_SERVICE_DIR, TQString(), TQDir::Name|TQDir::IgnoreCase, TQDir::Files);
-	TQStringList services = serviceDir.entryList ().grep (".name", true);
-
-	if (services.count () > 0) {
-		// read in all available Services
-		for (TQStringList::Iterator i = services.begin (); i != services.end (); ++i) {
-			TQString service = NM_PLUGIN_SERVICE_DIR + TQString ("/") + *i;
-			TDEConfig* tdeconfig = new TDEConfig (service, true, true, "config");
-			tdeconfig->setGroup ("VPN Connection");
-
-			TQString serviceName = tdeconfig->readEntry("name", TQString());
-			serviceName = serviceName.lower();
-
-			if (serviceName == "openvpn") {
-				ret.append(TDENetworkVPNType::OpenVPN);
-			}
-			if (serviceName == "pptp") {
-				ret.append(TDENetworkVPNType::PPTP);
-			}
-			if (serviceName == "strongswan") {
-				ret.append(TDENetworkVPNType::StrongSwan);
-			}
-			if (serviceName == "vpnc") {
-				ret.append(TDENetworkVPNType::VPNC);
-			}
+	// Look in the LIB directory first, since that seems to be where plugins are stored nowadays.
+	TQDir libServiceDir(NM_PLUGIN_SERVICE_DIR_LIB, "*.name", TQDir::Name | TQDir::IgnoreCase, TQDir::Files);
+	TQDir etcServiceDir(NM_PLUGIN_SERVICE_DIR_ETC, "*.name", TQDir::Name | TQDir::IgnoreCase, TQDir::Files);
+	TQStringList services = libServiceDir.entryList() + etcServiceDir.entryList();
+	size_t libEntryCount = libServiceDir.count();
+
+	// Read in all services.
+	for (size_t i = 0; i < services.count(); ++i)
+	{
+		TQString fileName = TQString("%1/").arg(i < libEntryCount ? NM_PLUGIN_SERVICE_DIR_LIB : NM_PLUGIN_SERVICE_DIR_ETC) + services[i];
+		TDEConfig *config = new TDEConfig(fileName, true, true, "config");
+		config->setGroup("VPN Connection");
 
-			delete tdeconfig;
+		TQString serviceName = config->readEntry("name", TQString(""));
+		serviceName = serviceName.lower();
+		if (serviceName == "openvpn")
+		{
+			ret.append(TDENetworkVPNType::OpenVPN);
+		}
+		if (serviceName == "pptp")
+		{
+			ret.append(TDENetworkVPNType::PPTP);
+		}
+		if (serviceName == "strongswan")
+		{
+			ret.append(TDENetworkVPNType::StrongSwan);
+		}
+		if (serviceName == "vpnc")
+		{
+			ret.append(TDENetworkVPNType::VPNC);
 		}
+
+		delete config;
 	}
 
 	return ret;
diff --git a/tdecore/tdehw/networkbackends/network-manager/network-manager.h b/tdecore/tdehw/networkbackends/network-manager/network-manager.h
index 8af99e846..e21e2837d 100644
--- a/tdecore/tdehw/networkbackends/network-manager/network-manager.h
+++ b/tdecore/tdehw/networkbackends/network-manager/network-manager.h
@@ -142,7 +142,8 @@
 #define NM_802_11_DEVICE_CAP_WPA		0x10
 #define NM_802_11_DEVICE_CAP_RSN		0x20
 //====================================================================================================
-#define NM_PLUGIN_SERVICE_DIR	"/etc/NetworkManager/VPN"
+#define NM_PLUGIN_SERVICE_DIR_ETC	"/etc/NetworkManager/VPN"     // old plugin location
+#define NM_PLUGIN_SERVICE_DIR_LIB	"/usr/lib/NetworkManager/VPN" // new plugin location
 //====================================================================================================
 
 //====================================================================================================
-- 
cgit v1.2.1