diff options
| author | Loek Le Blansch <loek@pipeframe.xyz> | 2025-10-15 16:23:17 +0200 |
|---|---|---|
| committer | Loek Le Blansch <loek@pipeframe.xyz> | 2025-10-15 16:23:17 +0200 |
| commit | 7bbdd6cc10a6cc58521c350fb96d39eddd4e0aaa (patch) | |
| tree | b5422d5a5587c0a8cd7ab32aa3169636430f68eb | |
| parent | f90ce1e3a2fe48eb766abd624ef1729d87eec834 (diff) | |
make secrets agent-owned
| -rw-r--r-- | nmpass/main.py | 50 |
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: |