diff options
| -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: |