Commit Graph
424 Commits
Author SHA1 Message Date
Tobias Brunner 89149dbb5f android: Add fields for local and remote identities to data model 2016-05-02 18:38:15 +02:00
Tobias Brunner 7ab8ec7ad0 android: Avoid races between FragmentManager and state saving
onSaveInstanceState is apparently called after pausing the fragment and after
that committing any FragmentTransactions causes an IllegalStateException.
We could use commitAllowingStateLoss() but that's not really necessary
as we don't need to update when we are not active anyway.  We also don't
update the view directly after registration as this happens
asynchronously, i.e. we might be paused when it finishes.
2016-05-02 18:38:15 +02:00
Tobias Brunner 73a6bec3fc android: Increase the NAT-T keepalive interval to potentially save battery life
In case this doesn't work out we could probably make it configurable.

References #1326.
2016-05-02 18:38:08 +02:00
Tobias Brunner 44c8580ebe android: Show confirmation dialog also when connecting 2016-05-02 18:35:04 +02:00
Tobias Brunner 6e398a81f2 android: Avoid ProgressDialogs in VPN state fragment
Instead we use a ProgressBar directly in the fragment and use the
existing button to cancel the process.
2016-05-02 16:43:15 +02:00
Tobias Brunner 353526601a android: Fix display of remediation instructions with support library
Because the support library creates its own layout manually and uses
different IDs than the list_content layout we can't use the method we
used previously (and which is actually recommended in the docs).
2016-05-02 16:41:50 +02:00
Tobias Brunner 7c5fec3a5a android: Use Fragment class from the support library to avoid deprecation warnings
For instance, onAttach() with an Activitiy as first argument was deprecated
with API level 23.  However, the overload with a Context as first argument
does obviously not get called on older API levels.  Luckily, the classes
provided by the support library handle that for us.
2016-05-02 16:41:50 +02:00
Tobias Brunner 3256fe9ebb android: Update README.ndk 2016-05-02 16:41:50 +02:00
Tobias Brunner 1bd213db79 android: Use relative path for strongSwan sources
This avoids issues with recursion, which could have happened if the
strongswan directory was a symlink.
2016-05-02 16:41:49 +02:00
Tobias Brunner d9c5e6d786 android: Fix handling of redirects during IKE_AUTH 2016-05-02 16:41:25 +02:00
Tobias Brunner 90172b66c4 android: Fix color of lists and buttons on older platforms
This adds a workaround for an issue on older platforms where the list is
not properly styled with colorAccent.  Similarly applies to borderless buttons.
2016-04-27 14:24:27 +02:00
Tobias Brunner 2a68938b2e android: Use Activity as context for VpnProfileAdapter to fix theme
When using the application context theme customizations wouldn't get
applied for some reason.
2016-04-27 14:24:27 +02:00
Tobias Brunner 19e22af199 android: Use "server" instead of "gateway" in profile editor
The term "gateway" is unfamiliar for most new users (or they confuse it
with the default gateway of their network) but they usually know that
they want to connect to a "server".
2016-04-27 14:24:27 +02:00
Tobias Brunner 61ac729662 android: Define a new color scheme
This mainly changes the color of the appbar (colorPrimary), the color
of the status bar (colorPrimaryDark) is black like the default.
The accent color (colorAccent) used for controls like buttons and check
boxes is a slightly toned down version of the default.
2016-04-27 14:24:27 +02:00
Tobias Brunner 8e71dd9e82 android: Get a warning on use of deprecated features 2016-04-27 14:24:27 +02:00
Tobias Brunner 4c5f4a3d2a android: Replace use of deprecate getColor() method overload 2016-04-27 14:24:26 +02:00
Tobias Brunner 48123633cc android: Make font in log view monospace again on Android 5+ 2016-04-27 14:24:26 +02:00
Tobias Brunner de2fbd0e3f android: Avoid deprecated tabs in the ActionBar in TrustedCertificatesActivity
Instead we use TabLayout and ViewPager from the support libraries.
2016-04-27 14:24:26 +02:00
Tobias Brunner b9f79bc431 android: Automatically reload certificates if manager is reset
No need to manually reset the fragments anymore.
2016-04-27 14:24:26 +02:00
Tobias Brunner 01bade451f android: Make TrustedCertificateManager an Observable
Observers are notified when the manager is reset (and initially when the
certificates are first loaded).
2016-04-27 14:24:26 +02:00
Tobias Brunner 77c1c28d74 android: Switch to AppCompat/Material theme for dialogs
There is no AppCompatProgressDialog class as the use of ProgressDialog
is discouraged (instead progress bars should be placed in the layout directly).
To display the current ProgressDialog instances correctly on systems < 21 we
modify the window background color.
2016-04-27 14:24:25 +02:00
Tobias Brunner 6b31828269 android: Switch to AppCompat/Material theme and use custom Toolbar as AppBar
Also includes some whitespace/formatting changes due to the switch to
Android Studio.
2016-04-27 14:24:25 +02:00
Tobias Brunner 9dd6d1e6db android: Ignore build/ in project directory 2016-04-27 14:24:25 +02:00
Tobias Brunner 10d0de0c9a android: Update platform tools and pull in support libs
We'll have to change some stuff that Google deprecated (e.g. the tabs in
the ActionBar) and that requires changing the theme at least in activities.
Since that would look a bit inconsistent we'll change it globally and
use parts of the support library.
2016-04-27 14:24:25 +02:00
Tobias Brunner 9ab746cb0f android: Update Android Gradle plugin and wrapper 2016-04-27 14:24:25 +02:00
Tobias Brunner cb65e95d4a android: OPENSSL_NO_ENGINE is now properly defined in the headers 2016-04-15 10:32:36 +02:00
Tobias Brunner 2ba5dadb12 peer-cfg: Use struct to pass data to constructor 2016-04-09 16:51:01 +02:00
Tobias Brunner 8a00a8452d child-cfg: Use struct to pass data to constructor 2016-04-09 16:51:01 +02:00
Tobias Brunner 89da06ace9 kernel: Use structs to pass information to the kernel-ipsec interface 2016-04-09 16:50:59 +02:00
Andreas Steffen b12c53ce77 Use standard unsigned integer types 2016-03-24 18:52:48 +01:00
Tobias Brunner 2f3879c3fe android: Enable 64-bit ABIs 2016-03-23 14:18:52 +01:00
Tobias Brunner 17e36cd48c android: Enable build against API level 21
While building against this level in general would break our app on
older systems, the NDK will automatically use this level for 64-bit
ABI builds (which are not supported in older levels).  So to build
against 64-bit ABIs we have to support this API level.
2016-03-23 14:18:37 +01:00
Tobias Brunner 28649f6d91 libhydra: Remove empty unused library 2016-03-03 17:36:11 +01:00
Tobias Brunner 8394ea2a42 libhydra: Move kernel interface to libcharon
This moves hydra->kernel_interface to charon->kernel.
2016-03-03 17:36:11 +01:00
Tobias Brunner e8140531fc libipsec: Pass the same data to del_policy() as to add_policy()
We already do this for the other kernel interfaces.

Fixes e1e88d5add ("libipsec: Don't attempt deletion of any non-IPsec policies")
2016-02-04 11:02:59 +01:00
Tobias Brunner fe48e4ae31 android: Suppress compiler warnings about missing field initializers
Triggered by -Wextra for many INIT usages where we only partially
initialize a struct.
2015-11-13 18:24:45 +01:00
Tobias Brunner 3af7e09271 android: Add some (older) unit tests 2015-11-12 14:12:43 +01:00
Tobias Brunner 9e81f33b55 android: Properly handle shorter types in BufferedByteWriter
In Java all integer types are signed, when a negative integer is casted
to a larger type (e.g. int to long) then due to sign extension the upper
bytes are not 0.  So writing that value to a byte array does not produce
the expected result.  By overloading the putX() methods we make sure to
upcast the values correctly.
2015-11-12 14:12:13 +01:00
Tobias Brunner a50f3037ad android: Migrate to the Gradle build system
This uses a manual way to trigger the NDK build (the default with
on-the-fly Android.mk files does not work for us).
2015-11-12 14:11:37 +01:00
Tobias Brunner a6e0f14fd2 kernel-interface: Pass the same data to del_policy() that was passed to add_policy()
The additional data can be helpful to identify the exact policy to
delete.
2015-11-10 16:42:52 +01:00
Tobias Brunner 1d3e69c6da android: New release fixing roaming on 5+ and adding new advanced options 2015-07-28 13:57:13 +02:00
Tobias Brunner 1e323dc1b7 android: Keep NDK API level at 19
The headers/libraries changed a lot with level 21 so that our app won't
run on devices with Android < 5 when built against it.  We currently
don't need any new native APIs so that should be fine.
2015-07-28 13:27:34 +02:00
Tobias Brunner acc8948fa5 android: Apply split tunneling options when creating TUN device
Android blocks traffic for address families for which no IPs, DNS servers
or routes are installed via VpnService.Builder.  Since Android 5+ (API
level 21) it is possible to explicitly allow such traffic to bypass the VPN.

So for proper split tunneling we note whether we saw a VIP and/or DNS
server of a specific family, and if not, allow traffic of that family
to bypass the VPN using the new API (on older systems there is no change
and such traffic will still be blocked).  Otherwise, we do what we did so
far, that is, simply install the received routes (traffic selectors), all
other traffic will not be directed to the TUN device and use the underlying
network instead.

If traffic for a family should be blocked we install a default route via
TUN device even if we received more specific traffic selectors from the
server.  libipsec will use the actual traffic selectors as IPsec policies
and drop any packets it received that don't match them.  We only do this
if we saw any VIPs or DNS servers of a family.  Otherwise the traffic for
that family is blocked anyway.
2015-07-28 13:27:34 +02:00
Tobias Brunner bb40498df3 android: Build against the android-21 target 2015-07-28 13:27:34 +02:00
Tobias Brunner 3ee84fa976 android: Extend GUI so the split tunneling options can be set 2015-07-28 13:27:33 +02:00
Tobias Brunner f3d8da7644 android: Add field for split tunneling config to data model 2015-07-28 13:27:33 +02:00
Tobias Brunner 030bcee1b0 android: Retrigger a roam event if reportedly connected but no source address found
In dual-stack environments the IPv6 connectivity (via autoconfiguration)
might be established before the IPv4 connectivity (via DHCP).  It seems
Android triggers the CONNECTIVITY_ACTION broadcast already when the first
family is fully configured.  At that time we might not be able to find an
IPv4 source address.  And since Android does not trigger the broadcast
again if IPv4 connectivity is established, the connection is broken
afterwards.

So we store the connectivity state and if we are reportedly connected but
still find no source address we trigger a roam event to recheck for an IPv4
address.  This will cause regular rechecks if a device enters an IPv6-only
network, but I guess that's rare (otherwise we could limit the number of
rechecks done between connectivity changes).
2015-07-28 13:27:33 +02:00
Tobias Brunner 41b59a3443 android: Add method to check for connectivity to NetworkManager 2015-07-28 13:27:33 +02:00
Tobias Brunner 5da31733de android: Fix kernel-net implementation on Android 4.3 and earlier
Before fwmarks were used protected sockets were bound to the outbound
interface via SO_BINDTODEVICE.  This does not always seem to work well
together with our connect()/getsockname() trick if the server is covered
by the traffic selectors.  Calling protect() again after disconnecting
the socket seems to help, but if there is no connectivity at all we still
get the virtual IP back (maybe protect() does not bind the socket to any
interface then).
2015-07-28 13:27:33 +02:00
Tobias Brunner 1082372448 android: Add a custom kernel-net implementation to replace kernel-netlink
When roaming from a mobile network to WiFi on Android 5.x the event
received via ConnectivityManager is triggered before the mobile
connection is fully torn down (i.e. before the interface is disabled and
the routes disappear).  So for strongSwan the current path still seems
valid and since no roam event is triggered later the daemon never switches
to WiFi and the connection is broken afterwards.

A possible solution to this is enabling roam events in the kernel-netlink
plugin.  That would trigger an event when the device is finally disconnected
from the mobile network.  However, this could actually take a some time,
during which traffic continues to be sent via mobile network instead of WiFi.
That's because Android now uses multiple routing tables, routing rules and
fwmarks to direct traffic to the appropriate interface/table, but in our
plugin we don't have the information available that would allow us to make
the switch to a different network/routing table earlier (and we actually
prefer the current path if it is still valid).  Additionally, the plugin
produces quite a bit more events than ConnectivityManager (which was one
of the reasons to use the latter in the first place).

This custom kernel-net implementation is now specifically tailored for
Android.  Roam events are still triggered via ConnectivityManager but
the source address is determined via connect()/getsockname() on a VPN
excluded UDP socket, which does use the correct routing table as intended
by Android.  That way the daemon immediately sees a different source IP
when connectivity changes even if the device is connected to multiple
networks concurrently.
2015-07-28 13:27:33 +02:00