aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoek Le Blansch <loek@pipeframe.xyz>2025-10-15 16:23:17 +0200
committerLoek Le Blansch <loek@pipeframe.xyz>2025-10-15 16:23:17 +0200
commit7bbdd6cc10a6cc58521c350fb96d39eddd4e0aaa (patch)
treeb5422d5a5587c0a8cd7ab32aa3169636430f68eb
parentf90ce1e3a2fe48eb766abd624ef1729d87eec834 (diff)
make secrets agent-owned
-rw-r--r--nmpass/main.py50
1 files changed, 31 insertions, 19 deletions
diff --git a/nmpass/main.py b/nmpass/main.py
index 9c756c6..7ba1f23 100644
--- a/nmpass/main.py
+++ b/nmpass/main.py
@@ -1,15 +1,38 @@
from __future__ import annotations
-from asyncio import new_event_loop
-from sdbus_async.networkmanager import NetworkManagerSecretAgentInterfaceAsync, NetworkManagerAgentManager, NetworkManagerConnectionProperties
-from sdbus_async.networkmanager.settings import ConnectionProfile, EapolSettings, WirelessSecuritySettings
+from asyncio import AbstractEventLoop, new_event_loop
+from sdbus_async.networkmanager import NetworkConnectionSettings, NetworkManagerSecretAgentInterfaceAsync, NetworkManagerAgentManager, NetworkManagerConnectionProperties, NetworkManagerSettings
+from sdbus_async.networkmanager.settings import ConnectionProfile, ConnectionSettings, EapolSettings, WirelessSecuritySettings
from typing import Any
import sdbus
from .store import PasswordStore
+AGENT_OWNED = 1
+
class NetworkManagerPasswordStoreAgent(NetworkManagerSecretAgentInterfaceAsync):
- store = PasswordStore()
+ store: PasswordStore
+ loop: AbstractEventLoop
+
+ def __init__(self, loop: AbstractEventLoop):
+ super(NetworkManagerSecretAgentInterfaceAsync, self).__init__()
+ self.store = PasswordStore()
+ self.loop = loop
+
+ async def set_agent_owned(self, info: ConnectionSettings) -> None:
+ assert info.uuid is not None
+ settings_path = await NetworkManagerSettings().get_connection_by_uuid(info.uuid)
+
+ connection = NetworkConnectionSettings(settings_path)
+ profile = await connection.get_profile()
+
+ if profile.wireless_security is not None:
+ profile.wireless_security.psk_flags = AGENT_OWNED
+
+ if profile.eapol is not None:
+ profile.eapol.password_flags = AGENT_OWNED
+
+ await connection.update(profile.to_dbus())
@sdbus.dbus_method_async_override()
async def get_secrets(
@@ -32,30 +55,19 @@ class NetworkManagerPasswordStoreAgent(NetworkManagerSecretAgentInterfaceAsync):
return {}
if setting_name == '802-11-wireless-security':
- # TODO: set psk-flags=1
+ self.loop.create_task(self.set_agent_owned(profile.connection))
return { setting_name: WirelessSecuritySettings(psk=password).to_dbus() }
if setting_name == '802-1x':
- # TODO: set password-flags=1
+ self.loop.create_task(self.set_agent_owned(profile.connection))
return { setting_name: EapolSettings(password=password).to_dbus()}
return {}
- @sdbus.dbus_method_async_override()
- async def save_secrets(
- self,
- connection: NetworkManagerConnectionProperties,
- connection_path: str,
- ) -> None:
- print("save secrets!")
- profile = ConnectionProfile.from_dbus(connection)
- print(profile)
- raise NotImplementedError
-
def main():
- sdbus.set_default_bus(sdbus.sd_bus_open_system())
- agent = NetworkManagerPasswordStoreAgent()
loop = new_event_loop()
+ sdbus.set_default_bus(sdbus.sd_bus_open_system())
+ agent = NetworkManagerPasswordStoreAgent(loop)
agent.export_to_dbus('/org/freedesktop/NetworkManager/SecretAgent')
agent_manager = NetworkManagerAgentManager()
try: