On Sun, 2020-08-16 at 18:08 +0300, Ionuț Leonte wrote:
Hello Thomas, I don't think subclassing NMSecretAgentOld is possible in Python.
You can subclass things in pygobject ([1]), but I think you cannot override a virtual function (as you'd need). https://pygobject.readthedocs.io/en/latest/guide/api/gobject.html
I am now
trying to use the DBus interface to register my script as a Secret
Agent but
my code never gets called. Here's my current script:
import os
import sys
import gi
gi.require_version('NM', '1.0')
from gi.repository import Gio, GLib, NM
base_path = os.path.abspath(os.path.dirname(sys.argv[0]))
xml_path = os.path.join(
base_path,
'org.freedesktop.NetworkManager.SecretAgent.xml')
xml = open(xml_path, 'r').read()
node = Gio.DBusNodeInfo.new_for_xml(xml)
loop = GLib.MainLoop()
def handle_method_call(
connection, sender, object_path, interface_name,
method_name, params, invocation
):
print(f"CALLED: {method_name}({params.unpack()})")
invocation.return_gerror(GLib.Error())
def on_bus_acquired(connection, name):
print("Bus acquired for name, ", name)
reg_id = connection.register_object(
"/dev/ileonte/VPNSSO",
node.interfaces[0],
handle_method_call,
None, None
)
print(f'reg_id = {reg_id}')
def on_name_acquired(connection, name):
print("Name acquired :", name)
proxy = Gio.DBusProxy.new_for_bus_sync(
Gio.BusType.SYSTEM,
Gio.DBusProxyFlags.NONE,
None,
"org.freedesktop.NetworkManager",
"/org/freedesktop/NetworkManager/AgentManager",
"org.freedesktop.NetworkManager.AgentManager",
None,
)
val = GLib.Variant(
'(su)',
(name, NM.SecretAgentCapabilities.VPN_HINTS))
ret = proxy.call_sync(
"RegisterWithCapabilities",
val,
Gio.DBusCallFlags.NO_AUTO_START,
-1,
None)
print(ret)
def on_name_lost(connection, name):
print("Name lost :", name)
exit(0)
if __name__ == "__main__":
owner_id = Gio.bus_own_name(
I don't think you need to own a (well known) name. Every connection to
the D-Bus has a unique name already (like ":1.42"). You can thus call
"RegisterWithCapabilities" and NetworkManager will try to contact you
on that name (":1.42"), where it expects you to have a D-Bus object
"/org/freedesktop/NetworkManager/SecretAgent" (with interface
"org.freedesktop.NetworkManager.SecretAgent").
Gio.BusType.SESSION,
"dev.ileonte.VPNSSO",
Gio.BusNameOwnerFlags.NONE,
on_bus_acquired,
on_name_acquired,
on_name_lost,
)
loop.run()
Gio.bus_unown_name(owner_id)
print("Exiting...")
I can see my object on the session bus, the call to
RegisterWithCapabilities()
seems to succeed however I never get any GetSecret() calls.
What am I doing wrong?
I'd suggest to enable level=TRACE logs and look what NetworkManager is saying. See https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/contrib/fedora/rpm/NetworkManager.conf#n28 Did it see your secret-agent register? Did it consider it for secret- requests? best, Thomas
Attachment:
signature.asc
Description: This is a digitally signed message part