Commit graph

15542 commits

Author SHA1 Message Date
Thomas Haller
723e1fc76f
libnm: move dependency to libnm-crypto out of libnm-core's "nm-utils.c"
libnm-core is also used by the daemon, thus currently dragging in
libnm-crypto there. But could we ever drop that dependency?

One use of the libnm-crypto is in functions like nm_utils_file_is_certificate()
in "nm-utils.h". These are part of the public API of libnm.

But this is not used by the daemon. Move it to "libnm-client-core"
to be closer to where it's actually used.

As we have unit tests in "libnm-core-impl/tests" that test this function,
those unit tests also would need to move to "libnm-client-impl".
Instead, add the actual implementation of these function to "libnm-crypto"
and test it there.

This patch moves forward declarations from public header "nm-utils.h" to
"nm-client.h". Arguably, "nm-client.h" is not a great name, but we don't
have a general purpose header in "libnm-client-public", so use this.
Note that libnm users can only include <NetworkManager.h> and including
individual files is not supported (and even prevented). Thus moving
the declarations won't break any users.
2022-03-29 11:56:04 +02:00
Thomas Haller
901787e06f
build: move nm-crypto to separate directory "src/libnm-crypto"
libnm-core currently has a dependency on crypto libraries (either
"gnutls", "nss" or "null"). We need this huge dependency for few cases.

Move the crypto code to a separate static library"src/libnm-crypto/libnm-crypto.la".
The reasoning is that it becomes clearer where we have this dependency,
to use it more consciously, and to be better see how it's used.

We clearly need the crypto functionality in libnm. But do we also need
it in the daemon? Could we ever link the daemon without crypto libraries?

The goal of splitting the crypto part out, to better understand the
crypto dependency.
2022-03-29 11:56:04 +02:00
Thomas Haller
3a97604a27
libnm: don't depend nm-crypto on "nm-error.h"
"nm-error.h" is public API of libnm, and contains error numbers and
quarks. Clearly our "nm-crypto" implementation wants to use those
errors.

I want to move "nm-crypto" out of libnm, and as it's more basic, I think
it should not have a dependency on all of libnm-core. Also because
libnm-core currently uses nm-crypto, so there would be a circular
dependency. Which would be possible to do (libnm-core-aux-intern is
also used in such a way). But it's better avoided, to have clear
hierarchy of dependencies.

Add a version of the same error codes to libnm-base. libnm-base is a
very basic dependency (just one step above libnm-glib-aux).
2022-03-29 11:56:03 +02:00
Thomas Haller
89bba8fa84
libnm-base: add "nm-base.c" for implementing stuff from "nm-base.h" 2022-03-29 11:56:03 +02:00
Thomas Haller
34b4496028
libnm: no longer use "nm-utils.h" from "nm-crypto.c"
The goal is to make "nm-crypto.c" independent of libnm-core.
2022-03-29 11:56:03 +02:00
Thomas Haller
526a05d6f2
glib-aux: add _nm_utils_bin2hexstr() and use from nm_utils_bin2hexstr()
nm_utils_bin2hexstr() is part of public libnm API.
That means, if we want to use this function, we need to link with
libnm-core-impl.

This is used by "nm-crypto.c". That file is currently part of
libnm-core, but that will change.

Move the implementation to libnm-glib-aux, so that we can use this code
from all our glib-based code (because all our glib-based code is allowed
to link with libnm-glib-aux).
2022-03-29 11:56:03 +02:00
Thomas Haller
ccce9d394f
libnm/trivial: fix indentation in "NetworkManager.h" 2022-03-29 11:56:02 +02:00
Thomas Haller
ee1467fcdb
libnm/802-1x: check is-pkcs12 only for blob certificates in verify_tls()
If the certificate is not a blob, it makes no sense to call
nm_crypto_is_pkcs12_data().
2022-03-29 11:52:38 +02:00
Thomas Haller
d3a6b9e7cc
libnm/802-1x: move need_private_key_password() to need_secrets_tls()
When a static function only has one caller, it is often simpler to not
have the code in a separate function. Drop need_private_key_password()
and move it to need_secrets_tls().
2022-03-29 11:52:37 +02:00
Thomas Haller
bcb1ab9e1c
libnm/802-1x: don't use g_warning() in need_secrets_tls()
g_warning() for unexpected scheme is not right. Either, this should be an
assertion (and never be hit), or the library should be silent about conditions
that can happen regularly.
2022-03-29 11:52:37 +02:00
Thomas Haller
e4a7b671d6
libnm/802-1x: cleanup duplicate code paths in need_secrets_tls()
I think code is easier to understand, if the difference (between phase1
and phase2) is pushed to the bottom. Having one large "if(phase2){}else{}"
at the top makes it harder to compare the two branches and see where
they differ.
2022-03-29 11:52:37 +02:00
Thomas Haller
47f2c5e5db
libnm/802-1x: cleanup need_secrets_phase2() 2022-03-29 11:52:37 +02:00
Thomas Haller
a3aec9dc5c
libnm/802-1x: reuse verify_identity() in verify_ttls() implementation 2022-03-29 11:52:37 +02:00
Thomas Haller
d5ee67981c
libnm/802-1x: simplify verify_tls() for phase1 and phase2
The checks are duplicated and verbose. Combine them.
2022-03-29 11:52:33 +02:00
Beniamino Galvani
e51b4ca5fe cli: indicate missing radio hardware in "nmcli radio"
When no radio hardware is present in the system, "nmcli radio"
currently displays:

  WIFI-HW  WIFI     WWAN-HW  WWAN
  enabled  enabled  enabled  enabled

which is misleading. Use the new RadioFlags property to display
"missing" in the *-HW columns when there is no hardware for the
given radio technology.

https://bugzilla.redhat.com/show_bug.cgi?id=1996918
2022-03-29 09:34:07 +02:00
Beniamino Galvani
4a8a3847ad libnm: support radio flags 2022-03-29 09:34:07 +02:00
Beniamino Galvani
580ef03bee core: export radio flags
Introduce a RadioFlags property on the manager object. For now it
contains two bits WLAN_AVAILABLE, WWAN_AVAILABLE to indicate whether
any radio interface is present in the system. The presence of a radio
is detected by looking at devices and rfkill switches.

In future, any radio-related read-only boolean flag can be exposed via
this property, including the already existing WirelessHardwareEnabled
and WwanHardwareEnabled properties.
2022-03-29 09:34:07 +02:00
Beniamino Galvani
2343148da8 core: introduce "unavailable" rfkill state
Introduce a new "unavailable" rfkill state to indicate that no rfkill
hardware was found. Currently it is still handled as "unblocked".
2022-03-29 09:12:36 +02:00
Thomas Haller
782f2fa8ef
keyfile: don't require verified profile in nm_keyfile_write()
Previously, only the daemon was writing keyfiles, and it ensures
that they are always valid.

As we now have this function as public API of libnm, we should drop this
restriction and write the profile the best we can. Granted, an invalid
profile may not be expressed in keyfile format, and the result is
undefined. But make the best of it.
2022-03-28 18:27:37 +02:00
Thomas Haller
b07bf1a8bb
keyfile: add write_handle_warn() helper 2022-03-28 18:27:37 +02:00
Thomas Haller
cec1269795
keyfile: rename handle_warn() to read_handle_warn()
We will also want to warn during write.
2022-03-28 18:27:36 +02:00
Thomas Haller
cfe594903e
keyfile: simplify code path in write_setting_value()
Avoid nested blocks. Check one condition after the other and handle it.
2022-03-28 18:27:36 +02:00
Thomas Haller
a0db72bf6d
keyfile: use nm_setting_8021x_scheme_vtable_by_setting_key() helper in cert_writer() 2022-03-28 18:27:36 +02:00
Thomas Haller
e965aa2536
libnm: add nm_setting_8021x_scheme_vtable_by_setting_key() helper
Add function to lookup the vtable by name. Implement a binary search.
2022-03-28 18:27:36 +02:00
Thomas Haller
22dcfb3a67
libnm: fix update of cached option names in nm_setting_option_set()
This is severe. We cache the list of names, and we must invalidate the
cache when the names change. Otherwise, out-of-bound access and crash.

Fixes: d0192b698e ('libnm: add nm_setting_option_set(), nm_setting_option_get_boolean(), nm_setting_option_set_boolean()')
Fixes: 150af44e10 ('libnm: add nm_setting_option_get_uint32(), nm_setting_option_set_uint32()')
2022-03-28 18:27:35 +02:00
Thomas Haller
681926ad43
glib-aux: make nm_gobject_notify_together_full() macro more robust
If __VA_ARGS__ contains odd arguments, it's not clear that N_ARG() gives
the same as the array initialization. Add a static assert that the
numbers agree to catch wrong usage of the macro.

For example:

    nm_gobject_notify_together(setting, a, b, );
2022-03-28 18:27:35 +02:00
Lubomir Rintel
aba3401df0 cli: remove one more g_assert()
I pushed accidentally pushed commit 9702310f25 ('clients: bulk removal
of g_assert*() statements') earlier than I intended, without addressing
one more case introduced by preceding merge. Fix it now.

Fixes: 9702310f25 ('clients: bulk removal of g_assert*() statements')

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1166
2022-03-28 15:04:07 +02:00
Lubomir Rintel
8dbe6fa0d5 merge: branch 'lr/conn-migrate'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1146
https://bugzilla.redhat.com/show_bug.cgi?id=2059608
2022-03-28 15:00:45 +02:00
Lubomir Rintel
1aa9c80b9b cli: add "connection migrate" subcommand
This is used to move a connection to a different settings plugin.
2022-03-28 14:59:30 +02:00
Lubomir Rintel
9702310f25 clients: bulk removal of g_assert*() statements
Assertions should be done in tests. If we detect an unexpected situation
at runtime, we shall fail more gracefully than crashing right away.
2022-03-28 13:51:44 +02:00
Lubomir Rintel
c7ab380a5c cli: fix handling of erroneous connections in "delete"
If we can't find a connection for any reason other than that it doesn't
exist, we should error out immediately and consistently, regardless of
whether we already encountered a non-existent connection.
2022-03-28 13:29:28 +02:00
Lubomir Rintel
e39e5d9372 cli: fix up help string for "delete"
Make it obvious that we can delete more connections in one go.
2022-03-28 13:29:28 +02:00
Lubomir Rintel
82d16789a5 settings-connection: add a "plugin" argument to Update2()
This will allow migrating a connection. If specified, the connection will
be confined to a particular settings plugin when written back. If the
plugin differs from the existing one, it will be removed from the old one.
2022-03-28 13:29:28 +02:00
Lubomir Rintel
f4f165f945 settings: add "plugin" argument to AddAndActivate2()
This will confine a newly added connection to a particular settings
plugin.
2022-03-28 13:29:28 +02:00
Daisuke Matsuda
fc2fab99b2
platform: add log detail for ENODEV at do_delete_object()
Deactivation of a NIC invokes deletion of qdisc. An ENODEV error can
be generated on deactivation of a virtual NIC when the kernel driver
has already deleted the device along with the qdisc.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1165
2022-03-28 10:52:01 +02:00
Thomas Haller
b1b1ee8cc4
libnm/tests: test that nm_vpn_service_plugin_read_vpn_details() does not consume "QUIT" command 2022-03-28 10:40:00 +02:00
Thomas Haller
6235815248
libnm: handle NUL characters in nm_vpn_service_plugin_read_vpn_details() and fix test
We expect to read NUL terminated strings. Upon NUL, we should do
something. Treat it as a line break.

Fixes: 8ae9cf4698 ('Revert "libnm: buffer reads in nm_vpn_service_plugin_read_vpn_details()"')
2022-03-28 10:36:05 +02:00
Bryan Jacobs
8ae9cf4698
Revert "libnm: buffer reads in nm_vpn_service_plugin_read_vpn_details()"
This partially reverts commit 4a9fcb0fc3, which replaced one-byte
reads with buffered ones in the VPN service plugin.

Unfortunately the buffering means that commands coming after the magic
"DONE" string were being pulled into the buffer. Secrets agents expect
a "QUIT" to come after the "DONE", and since with buffering "QUIT" was
in the buffer, this led to a twenty-second delay on every VPN
connection using a secrets manager.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1164

Fixes: 4a9fcb0fc3 ('libnm: buffer reads in nm_vpn_service_plugin_read_vpn_details()')
2022-03-28 09:39:13 +02:00
Christian Eggers
f6ec6ef364
core: create GMainLoop after daemonizing
The GMainLoop instance (and the default GMainContext singleton) is not
required for trivial operations like --print-config, --version or
--help). If running as SysV daemon, the event file descriptor is
unnecessarily dup'ed from the parent to the child process.

Signed-off-by: Christian Eggers <ceggers@arri.de>

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1160
2022-03-22 13:43:41 +01:00
Thomas Haller
0614017ac6
dnsmasq/shared: drop "--dhcp-lease-max=50" option
It's not clear why this option is set or why it's necessary. It was
set ever since.

Note that we automatically determines the DHCP range
nm_dnsmasq_utils_get_range(), and with /24 subnets (or larger)
the range spans up to 244 addresses.

With such a DHCP range it doesn't seem to make sense to limit the
number of leases to 50. It also doesn't seem to make sense to limit it
at all. Drop this.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/941

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1156
2022-03-21 17:14:17 +01:00
Thomas Haller
aaf2155023
libnm/docs: fix documentation for "proxy.pac-script" 2022-03-21 15:21:37 +01:00
Thomas Haller
6b191d6ea7
dhcp: simplify nm_dhcp_client_set_effective_client_id()
The "take" parameter of _set_effective_client_id() was always "FALSE". Drop it.
Also, drop _set_effective_client_id() and just call nm_dhcp_client_set_effective_client_id()
directly.
2022-03-21 13:09:28 +01:00
Thomas Haller
874403b588
dhcp: use nm_g_bytes_equal0() in _set_effective_client_id() 2022-03-21 13:04:52 +01:00
Beniamino Galvani
9ac143d2d5 dhcp: fix memory leak
Fixes: 58287cbcc0 ('core: rework IP configuration in NetworkManager using layer 3 configuration')
2022-03-20 17:30:39 +01:00
Thomas Haller
b3192d2d46
device: allow reapply for changed "connection.autoconnect-slaves" property
We list the properties that can be reapplied, and reject the reapply
operation for any other changes. The idea is that usually reapply
of a property requires an explicit implementation (or may not make
sense).

"connection.autoconnect-slaves" is something that takes effect when
activating the master device. It does not matter when the device
is already active, thus there is no need to reject the reapply
operation.

https://bugzilla.redhat.com/show_bug.cgi?id=2065049

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1150
2022-03-18 15:36:43 +01:00
Thomas Haller
14b9a9bd9d
connectivity: fix constructing hosts list for CURLOPT_RESOLVE
Curl's CURLOPT_RESOLVE expects one list entry per host. That
documentation ([1]) also makes that clear that the form is
"[+]HOST:PORT:ADDRESS[,ADDRESS]".

The way we constructed the list, only the last entry was honored:

  <trace> [1647551393.5362] connectivity: (eth0,IPv4,25) adding 'fedoraproject.org:80:18.159.254.57' to curl resolve list
  <trace> [1647551393.5363] connectivity: (eth0,IPv4,25) adding 'fedoraproject.org:80:152.19.134.142' to curl resolve list
  <trace> [1647551393.5363] connectivity: (eth0,IPv4,25) adding 'fedoraproject.org:80:18.192.40.85' to curl resolve list
  ...
  <trace> [1647551393.5366] connectivity: (eth0,IPv4,25) adding 'fedoraproject.org:80:85.236.55.6' to curl resolve list
  <trace> [1647551393.5366] connectivity: (eth0,IPv4,25) adding 'fedoraproject.org:80:38.145.60.20' to curl resolve list
  ...
  <trace> [1647551393.5415] connectivity: (eth0,IPv4,25) libcurl: == Info: Added fedoraproject.org:80:18.159.254.57 to DNS cache\012
  <trace> [1647551393.5416] connectivity: (eth0,IPv4,25) libcurl: == Info: RESOLVE fedoraproject.org:80 is - old addresses discarded!\012
  <trace> [1647551393.5416] connectivity: (eth0,IPv4,25) libcurl: == Info: Added fedoraproject.org:80:152.19.134.142 to DNS cache\012
  <trace> [1647551393.5417] connectivity: (eth0,IPv4,25) libcurl: == Info: RESOLVE fedoraproject.org:80 is - old addresses discarded!\012
  ...
  <trace> [1647551393.5422] connectivity: (eth0,IPv4,25) libcurl: == Info: RESOLVE fedoraproject.org:80 is - old addresses discarded!\012
  <trace> [1647551393.5423] connectivity: (eth0,IPv4,25) libcurl: == Info: Added fedoraproject.org:80:38.145.60.20 to DNS cache\012
  <trace> [1647551393.5424] connectivity: (eth0,IPv4,25) libcurl: == Info: Hostname fedoraproject.org was found in DNS cache\012
  <trace> [1647551393.5424] connectivity: (eth0,IPv4,25) libcurl: == Info:   Trying 38.145.60.20:80...\012

There are two possible fixes. Either join all addresses in one
entry, or use the '+' modifier. Do the former.

Now we get:

  <trace> [1647551967.0378] connectivity: (eth0,IPv4,25) set curl resolve list to 'fedoraproject.org:80:38.145.60.21,152.19.134.142,152...
  ...
  <trace> [1647551967.0559] connectivity: (eth0,IPv4,25) libcurl: == Info: Added fedoraproject.org:80:38.145.60.21,152.19.134.142,152.1...
  <trace> [1647551967.0560] connectivity: (eth0,IPv4,25) libcurl: == Info: Hostname fedoraproject.org was found in DNS cache\012
  <trace> [1647551967.0561] connectivity: (eth0,IPv4,25) libcurl: == Info:   Trying 38.145.60.21:80...\012

[1] https://curl.se/libcurl/c/CURLOPT_RESOLVE.html

Reported-by: Bastien Nocera <hadess@hadess.net>

Fixes: 2cec94bacc ('connectivity: use systemd-resolved for resolving the check endpoint')

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/648#note_1301596

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1153
2022-03-18 15:02:42 +01:00
Bastien Nocera
4e6b18e595 connectivity: Add debug to curl queries
Add debug output when we use curl to make queries.

References: https://curl.se/libcurl/c/debug.html
2022-03-17 20:41:31 +00:00
Thomas Haller
18d0ab14bc
device: drop unused variable and avoid compiler warning
../src/core/devices/nm-device-ethernet.c:1164:35: error: unused variable error [-Werror,-Wunused-variable]
              gs_free_error GError *error    = NULL;
                                    ^

Fixes: aa9b5e28eb ('ethernet: fix setting ip-ifindex for PPPoE connections')
2022-03-17 19:31:29 +01:00
Lubomir Rintel
feee84aac4 wifi: mark WEP connections incompatible if supplicant lacks capability
This allows us to reject activation of WEP profiles very early,
also providing a reasonable error code to the client:

  $ nmcli d wifi connect test
  Error: Failed to add/activate new connection: wpa_supplicant does not support WEP encryption
2022-03-17 12:44:53 +01:00
Lubomir Rintel
41d03a1b17 supplicant: check whether WEP is available
Since version 2.10, it's possible to build wpa_supplicant without WEP
support. In fact, it's disabled by default. Regrettably, there's no
indication in that version as to whether WEP is enabled or not.

A patch has been sent upstream that exposes the information on D-Bus:
https://patchwork.ozlabs.org/project/hostap/patch/20220307085446.706024-1-lkundrak@v3.sk/

This makes use of the above to indicate presence or absence of WEP
support.
2022-03-17 12:44:53 +01:00