Commit graph

12524 commits

Author SHA1 Message Date
Thomas Haller
2dcd9fa836 agent-manager: use cleanup macro for subject in agent_manager_register_with_capabilities()
More cleanup macros.
2019-12-31 02:13:45 +01:00
Thomas Haller
b32d656d26 agent-manager: drop unused error handling in agent_manager_register_with_capabilities()
nm_auth_chain_new_subject() cannot fail.
2019-12-31 02:13:45 +01:00
Thomas Haller
89bfb64af5 auth-chain: add nm_auth_chain_get_context() accessor
Will be used later. Also rename "struct NMAuthChain" to "struct _NMAuthChain".
It follows how we commonly name this kind of struct.
2019-12-31 02:13:45 +01:00
Antonio Cardace
1e45865e4f shared: nm-auth-subject: add unix-session type 2019-12-24 10:13:51 +01:00
Antonio Cardace
0f7994328d shared: move nm-dbus-auth-subject to shared/nm-libnm-core-intern
Move it to shared as it's useful for clients as well.

Move and rename nm_dbus_manager_new_auth_subject_from_context() and
nm_dbus_manager_new_auth_subject_from_message() in nm-dbus-manager.c
as they're needed there.
2019-12-24 10:13:51 +01:00
Beniamino Galvani
6af6f70d81 dhcp: nettools: start from init-reboot phase when reusing address
If we know the address used previously, also tell the client to start
from the init-reboot phase, so that it will start with a DHCP request
instead of a discover.
2019-12-23 16:19:35 +01:00
Beniamino Galvani
dd3114deb0 dhcp: nettools: fix parsing of classless routes option
Fixes: 6adade6f21 ('dhcp: add nettools dhcp4 client')
2019-12-23 16:19:35 +01:00
Beniamino Galvani
c9fbdf3cb0 dhcp: test parsing of domain-search option
Add a test for the parsing of the the domain-search option.
2019-12-23 16:19:35 +01:00
Thomas Haller
85ae90896c ifcfg-rh: remove calls to svUnsetAll()
We no longer need to explicitly clear values. Those that
we don't set, will be cleared automatically.
2019-12-21 13:37:11 +01:00
Thomas Haller
003a657c5c ifcfg-rh: treat base name as numbered tag and fix detection of NETMASK
We call svFindFirstNumberedKey() to check whether we have any NETMASK
set. Since commit 9085c5c3a9 ('ifcfg-rh: rename
svFindFirstKeyWithPrefix() to svFindFirstNumberedKey() for finding
NETMASK') that function would no longer find the "NETMASK" without
number.

Fix that, by letting nms_ifcfg_rh_utils_is_numbered_tag() return TRUE
for the tag itself. This also makes more sense, because it matches our
common understanding what numbered tags are.

Adjust the other callers that don't want this behavior to explicitly
check.

Fixes: 9085c5c3a9 ('ifcfg-rh: rename svFindFirstKeyWithPrefix() to svFindFirstNumberedKey() for finding NETMASK')
2019-12-21 13:37:11 +01:00
Thomas Haller
d9bb13f8e3 ifcfg-rh: add index for O(1) access of variables in shvarFile
Previously, setting or getting a variable required to scan all lines.

Note that frequently we would look up variables that didn't actually
exist, which we could only determine after searching the entire list.

Also, since we needed to handle having the same variable specified
multiple times (where the last occurrence wins), we always had to search
all keys and couldn't stop when finding the first key. Well, technically
we could have searched in reverse order for the getter, but that wasn't
done. For the setter we wanted to delete all but the last occurrences,
so to find them, we really had to search them all.

We want to support profiles with hundreds or thousands of addresses and routes.
This does not scale well.

Add an hash table to find the variables in constant time.

Test this commit and the parent commit:

   $ git clean -fdx &&
     CFLAGS=-O2 ./autogen.sh --with-more-asserts=0 &&
     ./tools/run-nm-test.sh -m src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh &&
     perf stat -r 50 -B src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh 1>/dev/null

Before:

 Performance counter stats for 'src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh' (50 runs):

            330.94 msec task-clock:u              #    0.961 CPUs utilized            ( +-  0.33% )
                 0      context-switches:u        #    0.000 K/sec
                 0      cpu-migrations:u          #    0.000 K/sec
             1,081      page-faults:u             #    0.003 M/sec                    ( +-  0.07% )
     1,035,923,116      cycles:u                  #    3.130 GHz                      ( +-  0.29% )
     1,800,084,022      instructions:u            #    1.74  insn per cycle           ( +-  0.01% )
       362,313,301      branches:u                # 1094.784 M/sec                    ( +-  0.02% )
         6,259,421      branch-misses:u           #    1.73% of all branches          ( +-  0.13% )

           0.34454 +- 0.00116 seconds time elapsed  ( +-  0.34% )

Now:

 Performance counter stats for 'src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh' (50 runs):

            329.78 msec task-clock:u              #    0.962 CPUs utilized            ( +-  0.39% )
                 0      context-switches:u        #    0.000 K/sec
                 0      cpu-migrations:u          #    0.000 K/sec
             1,084      page-faults:u             #    0.003 M/sec                    ( +-  0.05% )
     1,036,130,698      cycles:u                  #    3.142 GHz                      ( +-  0.13% )
     1,799,851,979      instructions:u            #    1.74  insn per cycle           ( +-  0.01% )
       360,374,338      branches:u                # 1092.756 M/sec                    ( +-  0.01% )
         6,160,796      branch-misses:u           #    1.71% of all branches          ( +-  0.08% )

           0.34287 +- 0.00133 seconds time elapsed  ( +-  0.39% )

So, not much difference. But this is not surprising, because test-ifcfg-rh loads and
writes predominantly ifcfg files with few variables. The difference should be visible
when having large files.
2019-12-21 12:56:23 +01:00
Thomas Haller
9085c5c3a9 ifcfg-rh: rename svFindFirstKeyWithPrefix() to svFindFirstNumberedKey() for finding NETMASK
svFindFirstKeyWithPrefix() only had one caller: to find whether there are
any NETMASK variables set. NETMASK is a numbered variable, so we should only
find variables that indeed follow the pattern. Since there was only
one caller, rename and repurpose the function.
2019-12-21 12:47:50 +01:00
Thomas Haller
820696f352 ifcfg-rh: remove explicit svUnsetValue() calls and rely on automatic removal of unvisited keys
Part 2 of previous commit. See there.
2019-12-21 12:47:50 +01:00
Thomas Haller
07262b165d ifcfg-rh: clear all untouched, known keys before writing ifcfg-rh file
When we write a connection profile to ifcfg-rh file, we first load the
possibly existing file and modify it. The purpose is to preserve
variables that we don't know about, keep comments and preserve the order
of the variables.

Note that the writer sets a bunch of variables according to the
profile's setting. At various places the writer would explicitly
clear variables with svUnsetValue(). However, that was problematic:

- we would not unset all variables that we care about. We really should
  not leave previous variables if they make no sense anymore for the
  profile. The only thing we want to preserve are entirely unknown keys
  and comments. Note that when the writer omits to clear an unset variable,
  it usually does so assuming that the reader would anyway ignore the
  key, become some other key renders it irrelevant. Given the complexity
  of the reader and writer, that is often not the case and hard to ensure.

  We might have simply forgotten a svUnsetValue(), which was an easy
  to make mistake and hard to find (because you'd have to test with
  a pre-existing profile that happens to contain that key, which leaves
  countless combinations for testing.

  That means, a profile written by the writter might be interpreted
  differently by the reader depending on which pre-existing keys were set.

- it was cumbersome to explicitly call svUnsetValue().
  Note that for numbered tags in particular we would iterate the keys
  trying to unset them. For example for addresses (like "IPADDR5") we
  would iterate over the first 256 IPADDR keys, trying to unset them.
  That is horrible. For one, it doesn't cover the case where there might
  be more than 256 addresses. Also, it adds a significant overhead every
  time.
  While writing a ifcfg file currently is O(n^2) because setting one key
  is O(l), with l being the number of keys/lines. So, if you set n keys
  in a file with l lines, you get O(n*l). Which is basically O(n^2),
  because the number of lines and the number of keys to set usually
  corresponds.
  So when setting 256 times IPADDR, the overall complexity was still
  O(n^2 + 256 * n) and didn't change. However, the 256 factor here can
  be very significant.

We should not explicitly unset variables, we should always unset all
known variables that we don't explicitly set.

The svUnsetValue() calls are still there. They will be dropped next.
2019-12-21 12:44:23 +01:00
Thomas Haller
8e212176b4 ifcfg-rh: add svUnsetDirtyWellknown() function
Helper function to remove all variables that are still dirty (not
visited) and well-known.

Also add svWriteFileWithoutDirtyWellknown() to clear the lines
before persisting to disk.
2019-12-21 12:41:48 +01:00
Thomas Haller
81e6fe963e ifcfg-rh: add functions to detect well-known ifcfg-rh keys
This adds a lot of meta-data about how we handle ifcfg-rh.

We will use this to prune/delete all variables that are not explicitly
set (dirty) but also well-known.

We could now easily emit a warning when an ifcfg-rh file contains
unused key.

We also could add more meta-data for each key. For example, we write
different files (ifcfg- and keys- files). We could add flags to indicate
that variables are valid in certain files. Currently that's not done.
Also, for simple properties we could associate the key with the
NMSetting property, and treat does generically, like keyfile does.

Anyway, there are potentials. For now, we will use this to clear dirty
variables.
2019-12-21 12:41:48 +01:00
Thomas Haller
3fa86a463c ifcfg-rh: refactor is_numbered_tag() macro and make it a function
Previously, IS_NUMBERED_TAG() could only be called with a C literal.
Add is_numbered_tag() which can be called with any C string.

Also, IS_NUMBERED_TAG_PARSE() and IS_NUMBERED_TAG() didn't do exactly
the same. I think they should. The only difference was if the number
was larger than 2^63-1. Now IS_NUMBERED_TAG() starts ignoring such
keys, which is fine.
2019-12-21 12:36:36 +01:00
Thomas Haller
32033d9086 ifcfg-rh: mark lines as non-dirty in shvarFile when we visit them
By default, all lines are now marked as dirty. Whenever we modify/set
a line, it becomes non-dirty. That will be used later to prune lines
that are dirty, that is, not yet visited.
2019-12-21 12:36:36 +01:00
Thomas Haller
89d8b254eb ifcfg-rh/trivial: rename nms_ifcfg_rh_utils_parse_unhandled_spec() helper
The name didn't follow the scheme.
2019-12-21 12:36:36 +01:00
Thomas Haller
785da51d83 core: add and indicate NM_CAPABILITY_OVS capability on D-Bus
https://bugzilla.redhat.com/show_bug.cgi?id=1785147
2019-12-21 11:33:59 +01:00
Beniamino Galvani
cfc418f887 dhcp: nettools: check return value of g_file_set_contents()
Found by covscan:

 NetworkManager-1.22.0/src/dhcp/nm-dhcp-nettools.c:945: check_return:
 Calling "g_file_set_contents" without checking return value (as is
 done elsewhere 16 out of 20 times).

Fixes: 9f89516928 ('dhcp: nettools: read/write lease files')
2019-12-18 10:02:48 +01:00
Beniamino Galvani
9aa00a8a14 dhcp: nettools: fix parsing of search domains option
'first' was never modified and so the dot was never added.

Fixes: 6adade6f21 ('dhcp: add nettools dhcp4 client')

https://bugzilla.redhat.com/show_bug.cgi?id=1783981
2019-12-17 14:33:25 +01:00
Thomas Haller
4a3ca7115a all: fix wrong "gs_free GError *" declarations
This is a bug and leads either to a leak or a crash.
2019-12-16 17:42:23 +01:00
Thomas Haller
9e02a67619 systemd: merge branch systemd into master 2019-12-16 10:22:09 +01:00
Thomas Haller
0d155d1821 systemd: update code from upstream (2019-12-13)
This is a direct dump from systemd git.

======

SYSTEMD_DIR=../systemd
COMMIT=c8bf87b3399a3dd0b17fd0003b9797635b161ee0

(
  cd "$SYSTEMD_DIR"
  git checkout "$COMMIT"
  git reset --hard
  git clean -fdx
)

git ls-files -z :/src/systemd/src/ \
                :/shared/systemd/src/ \
                :/shared/nm-std-aux/unaligned.h | \
  xargs -0 rm -f

nm_copy_sd_shared() {
    mkdir -p "./shared/systemd/$(dirname "$1")"
    cp "$SYSTEMD_DIR/$1" "./shared/systemd/$1"
}

nm_copy_sd_core() {
    mkdir -p "./src/systemd/$(dirname "$1")"
    cp "$SYSTEMD_DIR/$1" "./src/systemd/$1"
}

nm_copy_sd_stdaux() {
    mkdir -p "./shared/nm-std-aux/"
    cp "$SYSTEMD_DIR/$1" "./shared/nm-std-aux/${1##*/}"
}

nm_copy_sd_core "src/libsystemd-network/arp-util.c"
nm_copy_sd_core "src/libsystemd-network/arp-util.h"
nm_copy_sd_core "src/libsystemd-network/dhcp-identifier.c"
nm_copy_sd_core "src/libsystemd-network/dhcp-identifier.h"
nm_copy_sd_core "src/libsystemd-network/dhcp-internal.h"
nm_copy_sd_core "src/libsystemd-network/dhcp-lease-internal.h"
nm_copy_sd_core "src/libsystemd-network/dhcp-network.c"
nm_copy_sd_core "src/libsystemd-network/dhcp-option.c"
nm_copy_sd_core "src/libsystemd-network/dhcp-packet.c"
nm_copy_sd_core "src/libsystemd-network/dhcp-protocol.h"
nm_copy_sd_core "src/libsystemd-network/dhcp6-internal.h"
nm_copy_sd_core "src/libsystemd-network/dhcp6-lease-internal.h"
nm_copy_sd_core "src/libsystemd-network/dhcp6-network.c"
nm_copy_sd_core "src/libsystemd-network/dhcp6-option.c"
nm_copy_sd_core "src/libsystemd-network/dhcp6-protocol.h"
nm_copy_sd_core "src/libsystemd-network/lldp-internal.h"
nm_copy_sd_core "src/libsystemd-network/lldp-neighbor.c"
nm_copy_sd_core "src/libsystemd-network/lldp-neighbor.h"
nm_copy_sd_core "src/libsystemd-network/lldp-network.c"
nm_copy_sd_core "src/libsystemd-network/lldp-network.h"
nm_copy_sd_core "src/libsystemd-network/network-internal.c"
nm_copy_sd_core "src/libsystemd-network/network-internal.h"
nm_copy_sd_core "src/libsystemd-network/sd-dhcp-client.c"
nm_copy_sd_core "src/libsystemd-network/sd-dhcp-lease.c"
nm_copy_sd_core "src/libsystemd-network/sd-dhcp6-client.c"
nm_copy_sd_core "src/libsystemd-network/sd-dhcp6-lease.c"
nm_copy_sd_core "src/libsystemd-network/sd-ipv4acd.c"
nm_copy_sd_core "src/libsystemd-network/sd-ipv4ll.c"
nm_copy_sd_core "src/libsystemd-network/sd-lldp.c"
nm_copy_sd_core "src/libsystemd/sd-event/event-source.h"
nm_copy_sd_core "src/libsystemd/sd-event/event-util.c"
nm_copy_sd_core "src/libsystemd/sd-event/event-util.h"
nm_copy_sd_core "src/libsystemd/sd-event/sd-event.c"
nm_copy_sd_core "src/libsystemd/sd-id128/id128-util.c"
nm_copy_sd_core "src/libsystemd/sd-id128/id128-util.h"
nm_copy_sd_core "src/libsystemd/sd-id128/sd-id128.c"
nm_copy_sd_core "src/systemd/_sd-common.h"
nm_copy_sd_core "src/systemd/sd-dhcp-client.h"
nm_copy_sd_core "src/systemd/sd-dhcp-lease.h"
nm_copy_sd_core "src/systemd/sd-dhcp-option.h"
nm_copy_sd_core "src/systemd/sd-dhcp6-client.h"
nm_copy_sd_core "src/systemd/sd-dhcp6-lease.h"
nm_copy_sd_core "src/systemd/sd-event.h"
nm_copy_sd_core "src/systemd/sd-id128.h"
nm_copy_sd_core "src/systemd/sd-ipv4acd.h"
nm_copy_sd_core "src/systemd/sd-ipv4ll.h"
nm_copy_sd_core "src/systemd/sd-lldp.h"
nm_copy_sd_core "src/systemd/sd-ndisc.h"
nm_copy_sd_shared "src/basic/alloc-util.c"
nm_copy_sd_shared "src/basic/alloc-util.h"
nm_copy_sd_shared "src/basic/async.h"
nm_copy_sd_shared "src/basic/env-file.c"
nm_copy_sd_shared "src/basic/env-file.h"
nm_copy_sd_shared "src/basic/env-util.c"
nm_copy_sd_shared "src/basic/env-util.h"
nm_copy_sd_shared "src/basic/errno-util.h"
nm_copy_sd_shared "src/basic/escape.c"
nm_copy_sd_shared "src/basic/escape.h"
nm_copy_sd_shared "src/basic/ether-addr-util.c"
nm_copy_sd_shared "src/basic/ether-addr-util.h"
nm_copy_sd_shared "src/basic/extract-word.c"
nm_copy_sd_shared "src/basic/extract-word.h"
nm_copy_sd_shared "src/basic/fd-util.c"
nm_copy_sd_shared "src/basic/fd-util.h"
nm_copy_sd_shared "src/basic/fileio.c"
nm_copy_sd_shared "src/basic/fileio.h"
nm_copy_sd_shared "src/basic/format-util.c"
nm_copy_sd_shared "src/basic/format-util.h"
nm_copy_sd_shared "src/basic/fs-util.c"
nm_copy_sd_shared "src/basic/fs-util.h"
nm_copy_sd_shared "src/basic/hash-funcs.c"
nm_copy_sd_shared "src/basic/hash-funcs.h"
nm_copy_sd_shared "src/basic/hashmap.c"
nm_copy_sd_shared "src/basic/hashmap.h"
nm_copy_sd_shared "src/basic/hexdecoct.c"
nm_copy_sd_shared "src/basic/hexdecoct.h"
nm_copy_sd_shared "src/basic/hostname-util.c"
nm_copy_sd_shared "src/basic/hostname-util.h"
nm_copy_sd_shared "src/basic/in-addr-util.c"
nm_copy_sd_shared "src/basic/in-addr-util.h"
nm_copy_sd_shared "src/basic/io-util.c"
nm_copy_sd_shared "src/basic/io-util.h"
nm_copy_sd_shared "src/basic/list.h"
nm_copy_sd_shared "src/basic/log.h"
nm_copy_sd_shared "src/basic/macro.h"
nm_copy_sd_shared "src/basic/memory-util.c"
nm_copy_sd_shared "src/basic/memory-util.h"
nm_copy_sd_shared "src/basic/mempool.c"
nm_copy_sd_shared "src/basic/mempool.h"
nm_copy_sd_shared "src/basic/missing_fcntl.h"
nm_copy_sd_shared "src/basic/missing_random.h"
nm_copy_sd_shared "src/basic/missing_socket.h"
nm_copy_sd_shared "src/basic/missing_stat.h"
nm_copy_sd_shared "src/basic/missing_syscall.h"
nm_copy_sd_shared "src/basic/missing_type.h"
nm_copy_sd_shared "src/basic/parse-util.c"
nm_copy_sd_shared "src/basic/parse-util.h"
nm_copy_sd_shared "src/basic/path-util.c"
nm_copy_sd_shared "src/basic/path-util.h"
nm_copy_sd_shared "src/basic/prioq.c"
nm_copy_sd_shared "src/basic/prioq.h"
nm_copy_sd_shared "src/basic/process-util.c"
nm_copy_sd_shared "src/basic/process-util.h"
nm_copy_sd_shared "src/basic/random-util.c"
nm_copy_sd_shared "src/basic/random-util.h"
nm_copy_sd_shared "src/basic/set.h"
nm_copy_sd_shared "src/basic/signal-util.c"
nm_copy_sd_shared "src/basic/signal-util.h"
nm_copy_sd_shared "src/basic/siphash24.h"
nm_copy_sd_shared "src/basic/socket-util.c"
nm_copy_sd_shared "src/basic/socket-util.h"
nm_copy_sd_shared "src/basic/sort-util.h"
nm_copy_sd_shared "src/basic/sparse-endian.h"
nm_copy_sd_shared "src/basic/stat-util.c"
nm_copy_sd_shared "src/basic/stat-util.h"
nm_copy_sd_shared "src/basic/stdio-util.h"
nm_copy_sd_shared "src/basic/string-table.c"
nm_copy_sd_shared "src/basic/string-table.h"
nm_copy_sd_shared "src/basic/string-util.c"
nm_copy_sd_shared "src/basic/string-util.h"
nm_copy_sd_shared "src/basic/strv.c"
nm_copy_sd_shared "src/basic/strv.h"
nm_copy_sd_shared "src/basic/strxcpyx.c"
nm_copy_sd_shared "src/basic/strxcpyx.h"
nm_copy_sd_shared "src/basic/time-util.c"
nm_copy_sd_shared "src/basic/time-util.h"
nm_copy_sd_shared "src/basic/tmpfile-util.c"
nm_copy_sd_shared "src/basic/tmpfile-util.h"
nm_copy_sd_shared "src/basic/umask-util.h"
nm_copy_sd_shared "src/basic/utf8.c"
nm_copy_sd_shared "src/basic/utf8.h"
nm_copy_sd_shared "src/basic/util.c"
nm_copy_sd_shared "src/basic/util.h"
nm_copy_sd_shared "src/shared/dns-domain.c"
nm_copy_sd_shared "src/shared/dns-domain.h"
nm_copy_sd_stdaux "src/basic/unaligned.h"
2019-12-15 15:14:48 +01:00
Beniamino Galvani
6c716912eb manager: create a virtual device only if the connection can autoconnect
The autoconnection for virtual devices currently works in two
phases. First we detect that there is suitable profile that can
autoconnect and we realize the device. Then, when the device becomes
'disconnected', autoconnect kicks in and starts the activation.

However, if autoconnect is blocked for a device, currently we do step
1 without step 2, leaving a stale interface around. Fix this by also
checking that autoconnect is not blocked during step 1.

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

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/360
2019-12-15 09:36:27 +01:00
Beniamino Galvani
6d6e1402dc device: don't reapply IP configuration if the ifindex is missing
Assertions will fail in ip_config_merge_and_apply() if the device
doesn't have an ifindex. Reproducible with:

 $ nmcli connection add type ovs-bridge ifname ovs0 ipv4.method disabled ipv6.method disabled
 Connection 'ovs-bridge-ovs0' (1d5e794b-10ad-4b2b-aa7c-5ca7e34b0a55) successfully added

 $ nmcli device reapply ovs0
 Error: Reapplying connection to device '(null)' (/org/freedesktop/NetworkManager/Devices/16) failed: Remote peer disconnected

 $ journalctl -u NetworkManager -e
 ...
 NetworkManager[73824]: nm_ip4_config_add_dependent_routes: assertion 'ifindex > 0' failed
 systemd[1]: NetworkManager.service: Main process exited, code=dumped, status=5/TRAP
 ...
2019-12-14 21:03:34 +01:00
Beniamino Galvani
0738c10445 ovs: check state before starting ip configuration after link change
When the link becomes available, check that the device is in the
ip-config state before starting ip configuration. Also, reset the
'waiting_for_interface' flag when the device deactivates.

https://bugzilla.redhat.com/show_bug.cgi?id=1781165
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/358
2019-12-14 21:02:31 +01:00
Thomas Haller
bd9b253540 all: rename time related function to spell out nsec/usec/msec/sec
The abbreviations "ns" and "ms" seem not very clear to me. Spell them
out to nsec/msec. Also, in parts we already used the longer abbreviations,
so it wasn't consistent.
2019-12-13 16:54:40 +01:00
Alexey Kodanev
70ebdc7730 nm-manager: restore passing correct size to sendfile in copy_lease()
Otherwise sendfile() fails with EINVAL when the file offset
is greater than zero (pos + size > max), always on the second
iteration.

Fixes: 0c6cd07ec8 ('nm-manager: remove lease file if copying dhclient lease fails')

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/359
2019-12-12 08:07:20 +01:00
Beniamino Galvani
f2dbf8fbc0 manager: forbid autoactivation of parent when it is blocked by user request
If a device is being autoactivated and requires a parent that is
blocked due to user request, the autoactivation attempt should fail
because NM shouldn't overrule the user decision.

https://bugzilla.redhat.com/show_bug.cgi?id=1765566
2019-12-11 13:46:57 +01:00
Beniamino Galvani
9339d3310e device: always allow reapply of MTU from wired setting
Many device types take the MTU value from the wired setting; usually
they don't implement the can_reapply_change() method and so the MTU
can't be changed with the Reapply() API.

Instead of implementing the method for all such devices to support the
same property (adding a lot of duplicated code), add a check in
NMDevice to allow the reapply of MTU when we recognize that the device
uses the MTU from the wired setting.

Device types can still decide to implement can_reapply_change() and
support whatever properties they want, even from the wired setting.
2019-12-11 13:35:35 +01:00
Beniamino Galvani
ceeefa82c5 infiniband: allow reapply of MTU 2019-12-11 13:35:35 +01:00
Thomas Haller
fd8c8ffe0d config: print config warnings during NetworkManager --print-config 2019-12-11 11:52:05 +01:00
Thomas Haller
8f96d3cb0c config: emit warning about invalid main.auth-polkit setting 2019-12-11 11:52:05 +01:00
Thomas Haller
8d20b9363b config: add nm_config_data_get_warnings() to get additional warnings about wrong configuration
No additional warnings are implemented yet.
2019-12-11 11:52:05 +01:00
Thomas Haller
6998c5f129 config: return GPtrArray with warnings from internal read_entire_config() function
The underlying GPtrArray that we use to construct the list of warnings
is more useful than the strv array. For the internal function, don't
let it return the strv array but instead take (and fill) the warnings
as GPtrArray. There is no difference in practice, because also
previously we would always create an empty GPtrArray.
2019-12-11 11:52:05 +01:00
Thomas Haller
6d7446e52f core: add main.auth-polkit option "root-only"
We always build with PolicyKit support enabled, because it has no
additional dependencies, beside some D-Bus calls.

However, in NetworkManager.conf the user could configure
"main.auth-polkit" to disable PolicyKit. However, previously it would
only allow to disable PolicyKit while granting access to all users.

I think it's useful to have an option that disables PolicyKit and grants
access only to root. I think we should not go too far in implementing
our own authorization mechanisms beside PolicyKit (e.g. you cannot
disable PolicyKit and grant access based on group membership of the
user). However, disabling PolicyKit can be useful sometimes, and it's
simple to implement a "root-only" setup.

Note one change is that when NetworkManager now runs without a D-Bus
connection (in initrd), it would deny all non-root requests. Previously
it would grant access. I think there should be little difference in
practice, because if we have no D-Bus we also don't have any requests to
authenticate.
2019-12-11 11:52:05 +01:00
Thomas Haller
0c6cd07ec8 nm-manager: remove lease file if copying dhclient lease fails
- also use nm_auto_close and nm_close().
2019-12-11 10:05:00 +01:00
Alexey Kodanev
ce1f9e6eb9 nm-manager: fix selinux label for dhclient lease file from initramfs
When moving a lease file from initramfs directory to NetworkManager
run directory, SELinux label for that file retains tmpfs_t type.

Fix it by using sendfile() instead of rename(). That way, the
lease file will have the default type: NetworkManager_var_run_t.
Since we take ownership of the lease file, also drop it from the
old location.

* Before the patch:
ls -Z /var/run/NetworkManager/dhclient-*.lease
system_u:object_r:tmpfs_t:s0 dhclient-13162c00-abfb-4e28-bbfb-170187ddd044-ens3.lease

* After:
ls -Z /var/run/NetworkManager/dhclient-*.lease
system_u:object_r:NetworkManager_var_run_t:s0 dhclient-f47d1908-67ae-49c6-bd5e-19a690d85526-ens3.lease

Fixes: f2fe6c03ee ('manager: don't treat the initramfs-configured DHCP connections as generated')

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/353
2019-12-11 09:58:45 +01:00
Thomas Haller
33754752ea core: use nm_client_permission_result_to_string() to map permission result
In NetworkManager we have NMAuthCallResult, which is really a duplicate
of NMClientPermissionResult.

Maybe NMAuthCallResult should be entirely replaced by NMClientPermissionResult.
But the name NMClientPermissionResult is a bit awkward. But then the
duplication is even more awkward... fixing this is left for another day.
2019-12-10 07:53:25 +01:00
Thomas Haller
466a4c4562 core: don't duplicate list of known permissions in impl_manager_get_permissions()
Reuse the list of all permissions and don't duplicate it.

Also, now the result of GetPermissions() on D-Bus contains the
permissions sorted by name. We get it almost for free, and it's
a nice property.
2019-12-10 07:53:25 +01:00
Thomas Haller
50a12ce2d5 core: also return unknown permission check result
For example with

  mount -o remount,rw,hidepid=1 /proc/

all permission checks will fail with an error. Internally, we map the
failure to NM_AUTH_CALL_RESULT_UNKNOWN.

    <trace> [1575645672.5958] auth: call[1069]: CheckAuthorization(org.freedesktop.NetworkManager.enable-disable-connectivity-check), subject=unix-process[pid=468316, uid=1000, start=1912881]
    <trace> [1575645672.6295] auth: call[1069]: completed: failed: GDBus.Error:org.gtk.GDBus.UnmappedGError.Quark._g_2dfile_2derror_2dquark.Code4: Failed to open file “/proc/468316/status”: No such file or directory
    <debug> [1575645672.6296] manager: unknown auth chain result 0

First of all, we should not log a debug message about that (we already log the
result of permission checks separately).

Also, we should include the unknown result in the response. The permission was
checked, and omitting it from GetPermissions() result seems wrong (even if we
failed to get the result).

Note that "unknown" is now a new possible return value on D-Bus. But
see how nm_permission_result_to_client() would map such a value to
"unknown" as well. So, it's probably a fine extension of the D-Bus API.

Note that NMClient API is currently quite limited. The user won't know
whether permissions were received (and if they were received, they
could not distinguish between UNKNOWN and absent). Hence, returning
all permissions as unknown (or not at all) causes `nmcli general permissions`
to hang. The solution here is to improve NMClient API to allow the user
to know when the permissions are received. But this patch doesn't
fix the hanging of nmcli nor the limitation of NMClient's API.
2019-12-10 07:53:25 +01:00
Thomas Haller
b650d1d181 core: also check "org.freedesktop.NetworkManager.wifi.scan" permissions 2019-12-10 07:53:25 +01:00
Thomas Haller
e0569ee575 settings: assert that we don't leak error variable in impl_settings_load_connections() 2019-12-09 09:54:17 +01:00
Thomas Haller
eb642fecdf settings: fix use after free in keyfile's load_connections()
Fixes: d35d3c468a ('settings: rework tracking settings connections and settings plugins')
2019-12-09 09:54:11 +01:00
Thomas Haller
1e742e0fb4 ifcfg: don't use D-Bus connection if NMDBusManager is without main connection
In configure-and-quit mode, NMDBusManager does not have a D-Bus connection.
Likewise, ifcfg-rh plugin should not use one either.
2019-12-09 09:02:24 +01:00
Thomas Haller
9d602529cc settings/trivial: comment why we create GDBusConnection for ifcfg D-Bus interface
There is nothing to fix. Replace the FIXME comment.
2019-12-09 08:59:29 +01:00
Beniamino Galvani
93e9010b75 device: don't transition assumed devices to FAILED before ACTIVATED
If the activation of an assumed device fails, we first set the device
state to FAILED and then to ACTIVATED. In the FAILED state, the active
connection transitions to DEACTIVATED and clears its device pointer;
hence we end up with an inconsistent state which causes assertion
failures in other parts of the code (for example, get_best_ip_config()
assumes that the device of the best active connection is not NULL).

Don't first transition to FAILED and then to ACTIVATED, just set the
latter.

https://bugzilla.redhat.com/show_bug.cgi?id=1737774
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/351
2019-12-05 17:09:53 +01:00
David Bauer
9a2bbbbc7a wifi/utils: complete key-mgmt=owe for OWE capable APs 2019-12-05 14:00:10 +01:00