Commit graph

909 commits

Author SHA1 Message Date
Thomas Haller
558dacce89 libnm: implement nm_client_add_connection*() by using GDBusConnection directly 2019-10-16 08:56:01 +02:00
Thomas Haller
5f31fd3951 libnm: implement nm_client_save_hostname_async() by using GDBusConnection directly 2019-10-16 08:56:01 +02:00
Thomas Haller
c92eb66d38 libnm: implement nm_client_save_hostname() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
356f1f6f33 libnm: implement nm_client_reload_connections_async() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
89c1007f92 libnm: implement nm_client_reload_connections() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
4af6219226 libnm: implement nm_client_load_connections_async() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
d795bcd730 libnm: implement nm_client_load_connections() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
c1046dd803 libnm: implement nm_device_delete()/nm_device_delete_async() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
6ee416d247 libnm: implement nm_device_disconnect()/nm_device_disconnect_async() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
bafabddece libnm: implement nm_device_get_applied_connection()/nm_device_get_applied_connection_async() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
3a66761b92 libnm: implement nm_device_reapply()/nm_device_reapply_async() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
36df8eabe6 libnm: implement nm_remote_connection_get_secrets()/nm_remote_connection_get_secrets_async() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
fb3d91db30 libnm: implement nm_remote_connection_delete()/nm_remote_connection_delete_async() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
dd94a8c0a9 libnm: implement nm_remote_connection_save()/nm_remote_connection_save_async() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
eff5e730ef libnm: implement nm_remote_connection_update2() by using GDBusConnection directly
Also, implement nm_remote_connection_commit_changes_async() by calling
nm_remote_connection_update2(). It already was also calling the
Update2() D-Bus method.
2019-10-16 08:56:00 +02:00
Thomas Haller
79fbe7a578 libnm: implement nm_remote_connection_commit_changes() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
7871105ff9 libnm: implement nm_device_wifi_p2p_start_find()/nm_device_wifi_p2p_stop_find() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
999e4c6692 libnm: implement nm_device_wifi_request_scan_async() by using GDBusConnection directly
No longer keep track if a request is already pending. Previously,
in that case, the function would return success in an idle handler.

Instead, just always issue the new request. It's up to the caller to
rate-limit the requests and trigger a scan whenever appropriate. libnm
should not add additional logic to that.
2019-10-16 08:56:00 +02:00
Thomas Haller
e2b27f5736 libnm: implement nm_device_wifi_request_scan() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
09e275dc28 libnm: implement nm_client_reload() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
b1871a7549 libnm: implement nm_client_checkpoint_adjust_rollback_timeout() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
1bce0a090f libnm: implement nm_client_checkpoint_rollback() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
3a50585391 libnm: implement nm_client_checkpoint_destroy() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
5bdffa0ffd libnm: implement nm_client_checkpoint_create() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
b44d883d92 libnm: implement nm_client_check_connectivity_async() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
9bc83ca102 libnm: implement nm_client_check_connectivity() by using GDBusConnection directly
Note that nm_client_check_connectivity() has this odd behavior of
updating the connectivity state right away. We keep doing that.
2019-10-16 08:56:00 +02:00
Thomas Haller
2f21e96e84 libnm: implement nm_client_get_logging()/nm_client_set_logging() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
9f8aacf62a libnm: implement nm_client_networking_set_enabled() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
c85f6c7e85 libnm: implement synchronous get-permission check by using GDBusConnection directly
Drop uses of nmdbus_manager_call_get_permissions_sync().

Of course, we should ever call synchronous API while initizliaing the
NMClient. Needs to be fixed eventually.
2019-10-16 08:56:00 +02:00
Thomas Haller
332a7131a7 libnm: implement asynchronous get-permission check by using GDBusConnection directly
Drop uses of nmdbus_manager_call_get_permissions().
2019-10-16 08:56:00 +02:00
Thomas Haller
90d0ae0faf libnm: implement nm_client_activate_connection()/nm_client_add_and_activate_connection*() by using GDBusConnection directly
We still need the bits in "nm-manager.c", to wait until the
NMActiveConnection instance is ready. This is now done by
nm_manager_complete_active_connection().
2019-10-16 08:56:00 +02:00
Thomas Haller
eaddc22775 libnm: implement nm_client_deactivate_connection_async() by using GDBusConnection directly 2019-10-16 08:56:00 +02:00
Thomas Haller
0625f2c094 libnm: implement nm_client_deactivate_connection() by using GDBusConnection directly
Eventually, I will refactor libnm to no longer use gdbus-codegen and
no GDBusProxy. In preparation of that, we must stop using that
API.

As first step, change nm_client_deactivate_connection(). Note how this
was done previously:

 - nm_client_deactivate_connection() calls nm_manager_deactivate_connection()
   - nmdbus_manager_call_deactivate_connection_sync() calls g_dbus_proxy_call_sync()
     - g_dbus_proxy_call_sync() calls g_dbus_connection_call_sync()

Currently this is still a bit ugly, because NMClient doesn't directly
track the GDBusConnection nor the name owner. Instead, we need to peel
it out of the object manager. One day, that will all be nicer, but first
get rid of gdbus-codegen.
2019-10-16 08:56:00 +02:00
Thomas Haller
e6e6057a13 libnm: add helper functions for refactoring D-Bus calls in libnm
We will drop GDBusProxy and the gdbus-codegen classes. First, we need to
replace all D-Bus calls from nmdbus_*() API with plain uses of GDBusConnection.
For that, add accessors to get the dbus-connection and the name-owner.

This API is not beautiful, it's an interim solution for now.
2019-10-16 08:56:00 +02:00
Thomas Haller
ba2e1d52ad libnm,client: use nm_g_task_new() to set source-tag and check it
Public API should validate input arguments with g_return_*().
Tag the task with the source function (using nm_g_task_new())
and check it in the corresponding _finish() function.
2019-10-16 08:56:00 +02:00
Thomas Haller
256ba8c4cd libnm/tests: fix test for nm_client_add_and_activate_connection_async()
nm_client_add_and_activate_connection_async() must be completed by
nm_client_add_and_activate_connection_finish().

Fixes: be8060f42f ('libnm: add an object-creation-failed test')
2019-10-16 08:56:00 +02:00
Thomas Haller
86097cc2e8 libnm: fix return value for nm_remote_settings_reload_connections*() to ignore server result
Note that the server always returns TRUE for the boolean return value
of ReloadConnections. Hence, this should not change in behavior, because
the server would never have returned FALSE.

However, change behavior of the API. It's odd that the function might
return %FALSE without setting the error output. It's also not clear
what the boolean value of the "ReloadConnections" D-Bus would mean
anyway.
2019-10-16 08:56:00 +02:00
Thomas Haller
9dac3076f7 libnm: fix return value for nm_remote_settings_load_connections() to ignore server result
nm_remote_settings_load_connections() and nm_remote_settings_load_connections_async()
behave inconsistently.

It's unexpected, that a FALSE return value may leave @error unset.

Note that before commit 22e830f046 ('settings/d-bus: fix boolean
return value of "LoadConnections"'), the server boolean response
would have been bogus anyway (at least for some versions).

Unify the behavior, and ignore the boolean return value.
2019-10-16 08:56:00 +02:00
Thomas Haller
28d69b5642 libnm/device: simplify prepare_scan_options() for Wi-Fi scanning
It doesn't actually do anything, as the FIXME comment indicates.
I don't think there is anything to do either. Just simplify the
function.
2019-10-16 08:56:00 +02:00
Thomas Haller
40911fb99b libnm/device: fix memleak options variant in nm_device_wifi_request_scan_options*()
A function that accepts a floating variant must consume it.

Fixes: 7691fe5753 ('libnm: add new functions allowing passing options to RequestScan() D-Bus call')
2019-10-16 08:56:00 +02:00
Thomas Haller
92285cfd3e libnm/device: fix memleak in nm_device_wifi_request_scan_options*()
Fixes: 7691fe5753 ('libnm: add new functions allowing passing options to RequestScan() D-Bus call')
2019-10-16 08:56:00 +02:00
Thomas Haller
b9ff785744 libnm: fix annotation for return value of nm_remote_connection_get_secrets() 2019-10-16 08:56:00 +02:00
Thomas Haller
75a04a8a54 libnm: fix annotation for return value of nm_remote_connection_update2() 2019-10-16 08:56:00 +02:00
Thomas Haller
d80af0225e libnm: mark more synchronous libnm API as deprecated
This is a follow-up to commit e90684a169 ('libnm: deprecate
synchronous/blocking API in libnm') to mark more of such synchronous
API as deprecated.
2019-10-16 08:56:00 +02:00
Thomas Haller
194443237a libnm/trivial: remove unused struct RequestScanInfo in "nm-device-wifi-p2p.c" 2019-10-16 08:56:00 +02:00
Beniamino Galvani
8763e6da9c all: add 802-1x.optional property
Introduce a 802-1x.optional boolean property that can be used to
succeed the connection even after an authentication timeout or
failure.
2019-10-15 08:34:31 +02:00
Thomas Haller
f45aeba402 libnm: deprecate nm_client_check_connectivity() in 1.22
The previous commit marks all synchronous libnm API as deprecated.
In practice, the macro _NM_DEPRECATED_SYNC_METHOD expands to
nothing, because there is no immediate urgency to force users
to migrate.

However nm_client_check_connectivity() is especially bad: it
makes a synchronous call and then updates the content of the
cache artificially. Usually, NMClient's cache of D-Bus objects
is only updated by "PropertiesChanged" D-Bus signals.
nm_client_check_connectivity() instead will act on the response to
the "CheckConnectivity" D-Bus call -- a response that is picked
out of order from the ordered sequence of messages --  and will
update the cache instead of honoring the usual "PropertiesChanged"
signal.

I think such behavior is fundamentally broken. For a trivial property like
NM_CLIENT_CONNECTIVITY such behavior is odd at best. Note how applying
this approach to other functions (like nm_client_deactivate_connection(),
which would affect a much larger state) would not be feasible.

I also imagine it to be complicate to preserve this behavior when
reworking libnm, as I plan to do.

See also commit b799de281b ('libnm: update property in the manager
after connectivity check'), which introduced this behavior to "fix"
bgo#784629.
2019-10-03 10:46:49 +02:00
Thomas Haller
e90684a169 libnm: deprecate synchronous/blocking API in libnm
Note that D-Bus is fundamentally asynchronous. Doing blocking calls
on top of D-Bus is odd, especially for libnm's NMClient. That is because
NMClient essentially is a client-side cache of the objects from the D-Bus
interface. This cache should be filled exclusively by (asynchronous) D-Bus
events (PropertiesChanged). So, making a blocking D-Bus call means to wait
for a response and return it, while queuing all messages that are received
in the meantime.
Basically there are three ways how a synchronous API on NMClient could behave:

 1) the call just calls g_dbus_connection_call_sync(). This means
    that libnm sends a D-Bus request via GDBusConnection, and blockingly
    waits for the response. All D-Bus messages that get received in the
    meantime are queued in the GMainContext that belongs to NMClient.
    That means, none of these D-Bus events are processed until we
    iterate the GMainContext after the call returns. The effect is,
    that NMClient (and all cached objects in there) are unaffected by
    the D-Bus request.
    Most of the synchronous API calls in libnm are of this kind.
    The problem is that the strict ordering of D-Bus events gets
    violated.
    For some API this is not an immediate problem. Take for example
    nm_device_wifi_request_scan(). The call merely blockingly tells
    NetworkManager to start scanning, but since NetworkManager's D-Bus
    API does not directly expose any state that tells whether we are
    currently scanning, this out of order processing of the D-Bus
    request is a small issue.
    The problem is more obvious for nm_client_networking_set_enabled().
    After calling it, NM_CLIENT_NETWORKING_ENABLED is still unaffected
    and unchanged, because the PropertiesChanged signal from D-Bus
    is not yet processed.
    This means, while you make such a blocking call, NMClient's state
    does not change. But usually you perform the synchronous call
    to change some state. In this form, the blocking call is not useful,
    because NMClient only changes the state after iterating the GMainContext,
    and not after the blocking call returns.

 2) like 1), but after making the blocking g_dbus_connection_call_sync(),
    update the NMClient cache artificially. This is what
    nm_manager_check_connectivity() does, to "fix" bgo#784629.
    This also has the problem of out-of-order events, but it kinda
    solves the problem of not changing the state during the blocking
    call. But it does so by hacking the state of the cache. I think
    this is really wrong because the state should only be updated from
    the ordered stream of D-Bus messages (PropertiesChanged signal and
    similar). When libnm decides to modify the state, there may be already
    D-Bus messages queued that affect this very state.

 3) instead of calling g_dbus_connection_call_sync(), use the
    asynchronous g_dbus_connection_call(). If we would use a sepaate
    GMainContext for all D-Bus related calls, we could ensure that
    while we block for the response, we iterate that internal main context.
    This might be nice, because all events are processed in order and
    after the blocking call returns, the NMClient state is up to date.
    The are problems however: current blocking API does not do this,
    so it's a significant change in behavior. Also, it might be
    unexpected to the user that during the blocking call the entire
    content of NMClient's cache might change and all pointers to the
    cache might be invalidated. Also, of course NMClient would invoke
    signals for all the changes that happen.
    Another problem is that this would be more effort to implement
    and it involves a small performance overhead for all D-Bus related
    calls (because we have to serialize all events in an internal
    GMainContext first and then invoke them on the caller's context).
    Also, if the users wants this behavior, they could implement it themself
    by running libnm in their own GMainContext. Note that libnm might
    have bugs to make that really working, but that should be fixed
    instead of adding such synchrnous API behavior.

Read also [1], for why blocking calls are wrong.

[1] https://smcv.pseudorandom.co.uk/2008/11/nonblocking/

So, all possible behaviors for synchronous API have severe behavioural
issues.  Mark all this API as deprecated. Also, this serves the purpose of
identifying blocking D-Bus calls in libnm.

Note that "deprecated" here does not really mean that the API is going
to be removed. We don't break API. The user may:

  - continue to use this API. It's deprecated, awkward and discouraged,
    but if it works, by all means use it.

  - use asynchronous API. That's the only sensible way to use D-Bus.
    If libnm lacks a certain asynchronous counterpart, it should be
    added.

  - use GDBusConnection directly. There really isn't anything wrong
    with D-Bus or GDBusConnection. This deprecated API is just a wrapper
    around g_dbus_connection_call_sync(). You may call it directly
    without feeling dirty.

---

The only other remainging API is the synchronous GInitable call for
NMClient. That is an entirely separate beast and not particularly
wrong (from an API point of view).

Note that synchronous API in NMSecretAgentOld, NMVpnPluginOld and
NMVpnServicePlugin as not deprecated here. These types are not part
of the D-Bus cache and while they have similar issues, it's less severe
because they have less state.
2019-10-03 10:39:48 +02:00
Thomas Haller
3b69f02164 all: unify format of our Copyright source code comments
```bash

readarray -d '' FILES < <(
  git ls-files -z \
    ':(exclude)po' \
    ':(exclude)shared/c-rbtree' \
    ':(exclude)shared/c-list' \
    ':(exclude)shared/c-siphash' \
    ':(exclude)shared/c-stdaux' \
    ':(exclude)shared/n-acd' \
    ':(exclude)shared/n-dhcp4' \
    ':(exclude)src/systemd/src' \
    ':(exclude)shared/systemd/src' \
    ':(exclude)m4' \
    ':(exclude)COPYING*'
  )

sed \
  -e 's/^\(--\|#\| \*\) *\(([cC]) *\)\?Copyright \+\(\(([cC])\) \+\)\?\(\(20\|19\)[0-9][0-9]\) *[-–] *\(\(20\|19\)[0-9][0-9]\) \+\([^ ].*\)$/\1 C1pyright#\5 - \7#\9/' \
  -e 's/^\(--\|#\| \*\) *\(([cC]) *\)\?Copyright \+\(\(([cC])\) \+\)\?\(\(20\|19\)[0-9][0-9]\) *[,] *\(\(20\|19\)[0-9][0-9]\) \+\([^ ].*\)$/\1 C2pyright#\5, \7#\9/' \
  -e 's/^\(--\|#\| \*\) *\(([cC]) *\)\?Copyright \+\(\(([cC])\) \+\)\?\(\(20\|19\)[0-9][0-9]\) \+\([^ ].*\)$/\1 C3pyright#\5#\7/' \
  -e 's/^Copyright \(\(20\|19\)[0-9][0-9]\) \+\([^ ].*\)$/C4pyright#\1#\3/' \
  -i \
  "${FILES[@]}"

echo ">>> untouched Copyright lines"
git grep Copyright "${FILES[@]}"

echo ">>> Copyright lines with unusual extra"
git grep '\<C[0-9]pyright#' "${FILES[@]}" | grep -i reserved

sed \
  -e 's/\<C[0-9]pyright#\([^#]*\)#\(.*\)$/Copyright (C) \1 \2/' \
  -i \
  "${FILES[@]}"

```

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/298
2019-10-02 17:03:52 +02:00
Thomas Haller
819c903543 libnm/secret-agent-old: steal pointer instead of taking additional reference 2019-10-02 09:18:01 +02:00