Commit graph

432 commits

Author SHA1 Message Date
Thomas Haller
375d3e1cb8 vpn: support option to preserve previous routing information on VPN config update
On openvpn restart, the VPN helper script is invoked without full routing information.
Thus, the routes will be dropped because the helper script cannot provide them
on update.

Add an option "preserve-route" which tells NetworkManager to preserve
and reuse the previous configuration.

https://bugzilla.redhat.com/show_bug.cgi?id=1231338
https://bugzilla.gnome.org/show_bug.cgi?id=750873
2016-07-04 10:31:05 +02:00
Beniamino Galvani
df48628a48 vpn: don't merge DNS properties into parent device's configuration
DNS properties should not be copied to parent device's configuration
otherwise they will be applied twice, possibly with two different DNS
priorities.
2016-06-28 16:24:28 +02:00
Beniamino Galvani
641e8b00fe vpn: reuse existing ip_config objects when config gets updated
Previously we created a new NMIP[46]Config object to replace the
previous one every time the plugin reported a new IP configuration
through the Ip[46]Config signal, but the old configuration was not
removed from the DNS manager and would become stale.

The interaction with DNS manager is handled by NMPolicy, which only
reacts to changes in connection status, so it's not easy to have the
configuration removed from DNS while keeping the connection state
ACTIVATED.

A cleaner solutions is to avoid creating a new IP configuration object
and reuse the existing one if possible. The side effect is that the
D-Bus path of the object will not change, which seems also positive.

https://bugzilla.redhat.com/show_bug.cgi?id=1348901
2016-06-28 16:24:16 +02:00
Beniamino Galvani
19133b08da vpn: dispatch pre-up scripts only once
If the plugin sends a new configuration when the connection is already
activated the state should not go back to PRE_UP since this causes
dispatcher scripts to run again.
2016-06-28 16:24:16 +02:00
Thomas Haller
18501d7b68 vpn-connection: add @fallback_device argument to nm_vpn_connection_get_ip_iface()
and nm_vpn_connection_get_ip_ifindex(). For VPN types that have no own
IP interface, we often want instead lookup the IP interface from the
parent device.
2016-05-27 12:54:55 +02:00
Thomas Haller
5357b1874e vpn-connection: ensure ip_iface and ip_ifindex are set together
ip_iface and ip_ifindex come as a pair. They must be either set both, or not
at all. Ensure that whenever setting one, the other is set too (or cleared).
2016-05-27 12:27:59 +02:00
Thomas Haller
dacf496a2b vpn: set environment for VPN plugin to configure logging
Introduce two environment variables to configure logging
for the VPN plugins:

-  NM_VPN_LOG_LEVEL: when set, a syslog logging level (0-7).

-  NM_VPN_LOG_SYSLOG: either 0 or 1, whether the plugin should
      log to stdout or syslog. Basically, if NetworkManager itself
      runs in the forground, we also want that the plugin logs
      to stdout.
2016-05-24 21:53:27 +02:00
Beniamino Galvani
77ded12da4 core: use default value for ipvx.dns-priority
Fall back to system default value for ipvx.dns-priority when it's zero
in the setting. For VPNs the default value is 50; for other
connections is 100, but it depends also on the content of
[connection*] sections in NetworkManager.conf.
2016-05-12 17:13:50 +02:00
Thomas Haller
1ec5e0b958 vpn: fix crash when VPN service times-out to start
Previously, we took a reference when scheduling _daemon_exec_timeout().
That was changed, but we still wrongly unref'ed the VPN connection
on timeout.

Related: https://bugzilla.gnome.org/show_bug.cgi?id=766307

Fixes: 6c12f04e87
2016-05-12 13:01:23 +02:00
Thomas Haller
6bf022359f core/trivial: rename "source" field of addresses and routes
The "source" field of NMPlatformIPRoute (now "rt_source") maps to the
protocol field of the route. The source of NMPlatformIPAddress (now
"addr_source") has no direct equivalent in the kernel.

As their use is different, they should have different names. Also,
the name "source" is used all over the place. Hence give the fields
a more distinct name.
2016-04-28 12:53:21 +02:00
Thomas Haller
0d95ed3bb8 libnm/vpn: add nm_vpn_plugin_info_get_service()
Re-add nm_vpn_plugin_info_get_service(). This function *is* useful
and could be used by nm-applet.

This reverts commit 3517084b92.
2016-04-22 14:17:02 +02:00
Lubomir Rintel
178c972fac libnm-core/vpn-connection: get the service for bus path from plugin
...not from the connection. Otherwise the o.fdo.NM.openswan connection
would try to use a name they're not allowed to use.
2016-04-18 19:00:46 +02:00
Lubomir Rintel
dd0e070844 vpn-connection: don't fail the connection if there's no VPN gateway
The stongswan charon_nm plugin doesn't send a gateway.
The logic was accidentally broken with GDBus port.

Fixes: 231b0390a5
2016-04-14 12:39:56 +02:00
Thomas Haller
44768f0311 platform: change @plen field of NMPlatformIPxAddress to type guint8
On netlink layer, this field is uint8_t/uchar.

A larger (signed) plen makes no sense. Adjust the signatures
to have only guint8.
2016-04-11 11:26:36 +02:00
Thomas Haller
14ee5dd2f8 platform: change @plen field of NMPlatformIPxRoute to type guint8
On netlink layer, this field is uint8_t/uchar.

A larger (signed) plen makes no sense. Adjust the signatures
to have only guint8.
2016-04-11 11:26:36 +02:00
Lubomir Rintel
6c12f04e87 vpn-connection: do not leak the connection if there's no timeout 2016-03-18 18:04:55 +01:00
Lubomir Rintel
d568eb0e6c vpn-connection: don't dispose the proxy before we get the disconnect response
The return_method would be rejected by the dbus-daemon when the NM drops
its match, resulting in an ugly message in the log:

  method call time=1458301860.187048 sender=:1.267 -> destination=:1.276
    serial=5302 path=/org/freedesktop/NetworkManager/VPN/Plugin;
    interface=org.freedesktop.NetworkManager.VPN.Plugin; member=Disconnect
  method call time=1458301860.187054 sender=:1.267 -> destination=org.freedesktop.DBus
    serial=5303 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus;
    member=RemoveMatch
     string "type='signal',sender='org.freedesktop.DBus',
                                   interface='org.freedesktop.DBus',
                                   member='NameOwnerChanged',
                                   path='/org/freedesktop/DBus',
                                   arg0='org.freedesktop.NetworkManager.libreswan.Connection_10'"
  method return time=1458301860.187061 sender=org.freedesktop.DBus -> destination=:1.267
    serial=1835 reply_serial=5303
  ...
  method return time=1458301860.195351 sender=:1.276 -> destination=:1.267
    serial=19 reply_serial=5302
  error time=1458301860.195361 sender=org.freedesktop.DBus -> destination=:1.276
    error_name=org.freedesktop.DBus.Error.AccessDenied reply_serial=19
     string "Rejected send message, 7 matched rules; type="method_return",
             sender=":1.276" (uid=0 pid=26915
             comm="/usr/libexec/nm-libreswan-service --bus-name org.f")
             interface="(unset)" member="(unset)" error name="(unset)"
             requested_reply="0" destination=":1.267" (uid=0 pid=25724
             comm="/usr/sbin/NetworkManager --no-daemon ")"

Also, refcount the connection instance. While the proxy is alive, it
invokes singal callbacks that get the object as a parameter.
2016-03-18 18:04:55 +01:00
Thomas Haller
b36d721525 all: drop str_if_set() in favor of the "?:" operator
str_if_set() was added to replace the non-standard gcc extension "?:".
However, "?:" is supported by clang as well and we already use it at
several places.

Also, str_if_set() did not follow our naming scheme and renaming to
nm_str_if_set() would be ugly. So just drop it.
2016-03-08 17:57:20 +01:00
Thomas Haller
cd4f84b738 all: don't include error->code in log messages
GError codes are only unique per domain, so logging the code without
also indicating the domain is not helpful. And anyway, if the error
messages are not distinctive enough to tell the whole story then we
should fix the error messages.

Based-on-patch-by: Dan Winship <danw@gnome.org>
2016-03-03 18:54:20 +01:00
Thomas Haller
8bace23beb all: cleanup includes and let "nm-default.h" include "config.h"
- All internal source files (except "examples", which are not internal)
  should include "config.h" first. As also all internal source
  files should include "nm-default.h", let "config.h" be included
  by "nm-default.h" and include "nm-default.h" as first in every
  source file.
  We already wanted to include "nm-default.h" before other headers
  because it might contains some fixes (like "nm-glib.h" compatibility)
  that is required first.

- After including "nm-default.h", we optinally allow for including the
  corresponding header file for the source file at hand. The idea
  is to ensure that each header file is self contained.

- Don't include "config.h" or "nm-default.h" in any header file
  (except "nm-sd-adapt.h"). Public headers anyway must not include
  these headers, and internal headers are never included after
  "nm-default.h", as of the first previous point.

- Include all internal headers with quotes instead of angle brackets.
  In practice it doesn't matter, because in our public headers we must
  include other headers with angle brackets. As we use our public
  headers also to compile our interal source files, effectively the
  result must be the same. Still do it for consistency.

- Except for <config.h> itself. Include it with angle brackets as suggested by
  https://www.gnu.org/software/autoconf/manual/autoconf.html#Configuration-Headers
2016-02-19 17:53:25 +01:00
Thomas Haller
72255b71d7 utils: pass entire return statement to NM_UTILS_LOOKUP_DEFINE() 2016-02-01 14:20:26 +01:00
Thomas Haller
572b60a203 utils: change _NM_UTILS_LOOKUP_DEFINE() to generate compiler warning about missing enum values
Don't implement a "default" case so that we get a compiler warning
about unused enum values.
2016-02-01 14:10:04 +01:00
Lubomir Rintel
8e3a5f6d3a vpn-connection: try completing the connection when plugin sends config
In case there's no IP configuration we wan the connection to succeed,
not time out.
2016-01-28 11:50:15 +01:00
Thomas Haller
ba187e054d core: refactor functions to use NM_UTILS_LOOKUP*()
Also use NM_UTILS_LOOKUP_STR() macro, which can transform
unknown values to their numerical representation using
alloca().
2016-01-24 15:04:36 +01:00
Beniamino Galvani
f96abc8be5 core: always use gulong to store signal handler ids
We inconsistently use gulong,guint,int types to store signal handler
id, but the type returned by g_signal_connect() is a gulong.

This has no practical consequences because a int/guint is enough to
store the value, however it is better to use a consistent type, also
because nm_clear_g_signal_handler() accepts a pointer to the signal id
and thus it must be always called with the same pointer type.
2016-01-06 21:25:55 +01:00
Beniamino Galvani
fbd3286955 core,libnm: use nm_clear_g_source() where possible
Replacement was done with commands:

spatch --sp-file nm_clear_g_source.cocci --in-place --smpl-spacing --dir src
spatch --sp-file nm_clear_g_source.cocci --in-place --smpl-spacing --dir libnm

where nm_clear_g_source.cocci contains:

@@
expression e;
@@
- if (e) {
-    g_source_remove (e);
-    e = 0;
- }
+ nm_clear_g_source (&e);
2016-01-06 21:25:55 +01:00
Lubomir Rintel
2b0cacef2d vpn-connection: fix getting of MTU from the VPN config
This time we noticed before the angry mob.
Thank you, test suite! :)
2015-12-10 17:57:11 +01:00
Lubomir Rintel
1057e30dc8 vpn-connection: notify the object of banner change
Otherwise the D-Bus clients won't notice the banner has been set.
2015-12-10 16:12:02 +01:00
Dan Williams
f9ee20a7b2 core: explicitly unexport objects when we're done with them
Previously most objects were implicitly unexported when they were
destroyed, but since refcounts may make the object live longer than
intended, we should explicitly unexport them when they should no
longer be present on the bus.

This means we can assume that objects will always be un-exported
already when they are destroyed, *except* when quitting where most
objects will live until exit because NM leaves interfaces up and
running on quit.
2015-11-10 18:12:12 +01:00
Lubomir Rintel
3517084b92 vpn-plugin-info: drop nm_vpn_plugin_info_get_service()
It is not used externally and its use might be confusing and undesired when we
add plugin aliases. The external users should only use the name when idenfiying
the plugin and nm_vpn_plugin_info_list_find_by_service() when matchin the plugin.
2015-11-02 16:01:21 +01:00
Thomas Haller
6c8aa669a4 platform: properly handle IPv4 peer-addresses
The peer-address (IFA_ADDRESS) can also be all-zero (0.0.0.0).
That is distinct from an usual address without explicit peer-address,
which implicitly has the same peer and local address.

Previously, we treated an all-zero peer_address as having peer and
local address equal. This is especially grave, because the peer is part
of the primary key for an IPv4 address. So we not only get a property of
the address wrong, but we wrongly consider two different addresses as
one and the same.

To properly handle these addresses, we always must explicitly set the peer.
2015-11-02 13:57:01 +01:00
Thomas Haller
1a6f4d08ba vpn-connection: fix parsing IPv4 routes
Fixes: 3b145a33b7
2015-11-01 17:23:24 +01:00
Lubomir Rintel
3b145a33b7 vpn-connections: allow the plugin to specify route preferred src
Tunnelled VPNs can need that so that correct source address is used for tunnel
routes.
2015-11-01 11:28:10 +01:00
Lubomir Rintel
5c1c577c31 vpn-connections: set ifname for tunelled VPN configuration
The configuration is going to be applied on the parent interface.

If we didn't do this, an attempt to add a route would result in an assertion
failure:

  nm-ip4-config.c:1475:nm_ip4_config_add_route: assertion failed: (priv->ifindex)
2015-11-01 11:28:10 +01:00
Lubomir Rintel
5b48befaad vpn-manager: support multiple VPN connections of the same type
A separate instance of the support plugin is spawned for each connection with
a different bus name. The bus name is passed via --bus-name <name> argument.
Plugins that support the feature indicate it with
support-multiple-connections=true key in the [VPN Connection] section.

The bus name is currently generated by adding a .<connection.uuid> to the VPN
service name. It's guarranteed unique, but if it proves to be too long or ugly
it can easily be replaced with something more meaningful (such as the same number
as is used for connection's DBus name).

NMVpnService has been removed and folded into NMVpnConnection. A
NMVpnConnection will spawn a service plugin instance whenever it is activated
and notices the bus name it needs is not provided.

The NMVpnManager no longer needs to keep track of the connections in use apart
for compatibility purposes with plugins that don't support the feature.
2015-10-13 18:20:56 +02:00
Lubomir Rintel
9bbf5e94c2 device: allow multiple vpn IP configurations 2015-10-13 18:20:56 +02:00
Lubomir Rintel
965363a6d5 vpn-connection: export add nm_vpn_connection_get_service()
Will be useful later on.
2015-10-13 18:20:56 +02:00
Lubomir Rintel
e0fa48f224 vpn-connection: set the MTU for the VPN IP interface
The 9b79e6c73 commit moved setting of the MTU from IP4Config to NMDevice, but
VPN connections don't have a NMDevice instance (yet). Set the MTU also from the
VPN connection. Also, copying of the MTU to the IP4Config is no longer needed
as the ip4_config_commit no longer sets the MTU.

Fixes: 9b79e6c732

https://bugzilla.gnome.org/show_bug.cgi?id=754781
2015-09-29 18:24:48 +02:00
Thomas Haller
bb7e6c2cd4 firewall: always take a reference to NMFirewallManager during asynchronous operations
Always take a reference to the manager when scheaduling an asynchronous
operations. In fact, all callers want to keep the manager alive as long
as there are operations in progress.
2015-09-25 10:34:03 +02:00
Thomas Haller
94f888a262 firewall: refactor callback handling in NMFirewallManager
Refactor NMFirewallManager to have consistent semantics about
asynchronous calls.

  - the callback is always invoked exactly once, but never
    synchronously when starting the operation.
  - while cancelling the request, the callback is invoked
    synchronously with respect to the cancel operation.
  - you can cancel a request once (and once only).
  - you cannot cancel the request once the callback is invoked.
  - when disposing the object with requests pending, the
    callbacks are invoked synchronously.

- Add a callback argument to nm_firewall_manager_remove_from_zone().
  Otherwise, the user never knows whether a call is still pending and
  cancellable (as complete operations cannot be cancelled).
  In fact, it makes no sense trying to cancel a call if you don't care
  about when it completes.

- get rid of PENDING_CALL_DUMMY. The dummy callback allows cancellation
  any number of times. We want to catch wrong usage by asserting that an
  operation is only cancelled once.

- nm_firewall_manager_cancel_call() doesn't need the manager argument.
  Either the call-id is valid (and has a valid pointer to the manager),
  or there is a bug and it is a dangling pointer.
2015-09-25 10:34:02 +02:00
Thomas Haller
5bc4d7f0f9 firewall: add arguments to NMFirewallManagerAddRemoveCallback
We should return the target object and the call_id.
2015-09-25 10:34:02 +02:00
Thomas Haller
0d33b73e42 firewall/trivial: rename NMFirewallPendingCall to NMFirewallManagerCallId
Matches the naming scheme for other call-ids.
2015-09-25 10:34:02 +02:00
Jiří Klimeš
bbc7725218 vpn: use vpn.timeout property as timeout value for IP config (bgo #754754)
Some VPN services may take their time when establishing a connection. Let's
make our timeout configurable to be able to give such services a chance.

https://mail.gnome.org/archives/networkmanager-list/2015-April/msg00007.html

https://bugzilla.gnome.org/show_bug.cgi?id=754754
2015-09-21 16:59:04 +02:00
Lubomir Rintel
06da353242 core: separate active and applied connection
Clone the connection upon activation. This makes it safe for the user
to modify the original connection while it is activated.

This involves several changes:

- NMActiveConnection gets @settings_connection and @applied_connection.
  To support add-and-activate, we constructing a NMActiveConnection with
  no connection set. Previously, we would set the "connection" field to
  a temporary NMConnection. Now NMManager piggybacks this temporary
  connection as object-data (TAG_ACTIVE_CONNETION_ADD_AND_ACTIVATE).

- get rid of the functions nm_active_connection_get_connection_type()
  and nm_active_connection_get_connection_uuid(). From their names
  it is unclear whether this returns the settings or applied connection.
  The (few) callers should figure that out themselves.

- rename nm_active_connection_get_id() to
  nm_active_connection_get_settings_connection_id(). This function
  is only used internally for logging.

- dispatcher calls now get two connections as well. The
  applied-connection is used for the connection data, while
  the settings-connection is used for the connection path.

- needs special handling for properties that apply immediately
  when changed (nm_device_reapply_settings_immediately()).

Co-Authored-By: Thomas Haller <thaller@redhat.com>

https://bugzilla.gnome.org/show_bug.cgi?id=724041
2015-09-18 17:32:11 +02:00
Thomas Haller
80a7b41613 vpn-connection: refactor cancellation of secrets 2015-09-18 16:12:36 +02:00
Thomas Haller
b5a6883c10 vpn-connection: use logging macros _LOG*()
This now gives every logging line of a NMVpnConnection
a fully descriptive prefix.

Especially for non-debug logging, this looks a bit verbose
and repetitive, so we could suppress the prefix in that case.
I still add it because I think the verbose information does help
during debugging.
2015-09-18 16:12:36 +02:00
Thomas Haller
72c85c29a7 vpn-connection: add logging macros _LOG*() 2015-09-18 16:12:36 +02:00
Thomas Haller
d48ed98eb3 vpn-connection/trivial: consistently rename @connection argument to @self 2015-09-18 16:12:36 +02:00
Thomas Haller
1b5664fed4 agent-manager: always invoke complete function for asynchronous nm_agent_manager_get_secrets()
Refactor agent-manager to always invoke the complete function for
nm_agent_manager_get_secrets().

In general, the complete function is always invoked asnychronously
when starting the operation. On the other hand, when cancelling the
operation or disposing the manager with pending operations, we now
(always) synchronously invoke the callback.

This makes it simpler for the user to reliably cancel the request
and perform potential cleanup.

This behavior bubbles up through NMSettingsConnection and NMActRequest,
and other callers that make directly or indicrectly make use of
nm_agent_manager_get_secrets().
2015-09-18 14:31:31 +02:00
Thomas Haller
21fd5fa0ab settings: refactor call_id type of async functions for NMAgentManager, NMSettingsConnection and NMActRequest
Instead of having the call_id of type guint32, make it an (opaque)
pointer type.

This has the advantage of strong typing and avoids the possiblity
of reusing an invalid integer (or overflow of the call-id counter).

OTOH, it has the disadvantage, that after a call_id is disposed,
it might be reused for future invocations (because malloc might
reuse the memory).

In fact, it is always an error to use a call_id that is already
completed. This commit also adds assertions to the cancel() calls
that the provided call_id is a pending call. Hence, such a bug
will be uncovered by assertions (that only might not tigger in
certain unlikely cases where a call-id got reused).

Note that for NMAgentManager, save_secrets() and delete_secrets()
both returned a call_id. But they didn't also provide a callback when
the operation completes. So the user trying to cancel such a call,
cannot know whether the operation is still in process and he cannot
avoid triggering an assertion.
Fix that by not returning a call-id for these operations. No caller
cared about it anyway.

For NMSettingsConnection, also track the internally scheduled requests
for so that we can cancel them on dispose.
2015-09-18 14:31:31 +02:00