Inconsistency in flags sent to GetSecrets() for VPN connections



Hello,

I have the following code:

    import gi
    gi.require_version('NM', '1.0')
    from gi.repository import GLib, Gio, NM


    def handle_method_call(
        connection, sender, object_path, interface_name,
        method_name, params, invocation
    ):
        if interface_name == 'org.freedesktop.NetworkManager.SecretAgent':
            if method_name == 'GetSecrets':
                conn, path, sett, hints, flags = params.unpack()
                print(f'GetSecrets():')
                print(f'  path = {path}')
                print(f'  sett = {sett}')
                print(f'  hints = {hints}')
                print(f'  flags = {flags}')

                invocation.return_value(
                    GLib.Variant.new_tuple(GLib.Variant('a{sa{sv}}', {}))
                )
                return

            invocation.return_value(GLib.Variant('()', ()))


    xml_path = 'org.freedesktop.NetworkManager.SecretAgent.xml'  # from [2]

    xml = open(xml_path, 'r').read()
    node = Gio.DBusNodeInfo.new_for_xml(xml)

    print(f'Getting DBus proxy for org.freedesktop.NetworkManager')
    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,
    )

    print(f'Registering SecretAgent interface')
    proxy.get_connection().register_object(
        "/org/freedesktop/NetworkManager/SecretAgent",
        node.interfaces[0],
        handle_method_call,
        None, None
    )

    print(f'Registering SecretAgent object')
    proxy.call_sync(
        "Register",
        GLib.Variant.new_tuple(GLib.Variant.new_string('dev.ileonte.VPNSSO')),
        Gio.DBusCallFlags.NO_AUTO_START,
        -1,
        None)

    loop = GLib.MainLoop()
    loop.run()

It registers as a SecretAgent and prints the parameters that NetworkManager
sends to its GetSecret() method.

With KDE - tested on Gentoo (NM version 1.26.0) and Kubuntu 20.04 (NM version
1.22.10) - I see the following (correct?) behavior:
  - when I go to System Settings > Connections and click on a VPN connection
    (to see the settings of the connection) my GetSecrets() function gets
    called once with flags=4 (ie. USER_REQUESTED - see [1])
  - when I try to activate a VPN connection (via nmcli OR from the connections
    page in System Settings OR via the Plasma NetworkManager applet) my
    function gets called twice - once with flags=4 then immediately after
    with flags=5 (USER_REQUESTED | ALLOW_INTERACTION)

With GNOME - tested on Fedora 32 (NM version 1.22.14) and Ubuntu 20.04 (NM
version 1.22.10) - I see the following (incorrect?)
behavior:
  - when I go to Settings > Network and edit a VPN connection my function
    gets called once with flags=4 (same as the KDE case)
  - when I activate a VPN connection via nmcli or from Settings > Network my
    function gets called twice - once with flags=4 and once with flags=5
    immediately after
  - (!!) when I activate a VPN connection via the GNOME NetworkManager applet
    however my function only gets called once with flags=4. After that the
    default authentication dialog pops up and my function never gets called
    again. Furthermore, when testing with an OpenConnect VPN, I can see that
    nm-openconnect-auth-dialog gets run with the `-i` (interactive) parameter
    even though my function gets called without ALLOW_INTERACTION set in flags

I have tested with two types of VPN connection (OpenConnect and OpenVPN) and
I have seen this in both cases.

Is this intended behavior? Seems to me like the GNOME applet is maybe missing
some fix that was applied to the Settings > Network page in GNOME.

PS: On an older distribution (Ubuntu 18.04 with NM version 1.10.0) my function
always gets called with flags=4 so it looks to me like support for
ALLOW_INTERACTION was introduced only to some of the components.


[1] https://lazka.github.io/pgi-docs/#NM-1.0/flags.html#NM.SecretAgentGetSecretsFlags
[2] 
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/blob/master/introspection/org.freedesktop.NetworkManager.SecretAgent.xml


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]