Commit Graph

31 Commits

Author SHA1 Message Date
Jamil
4f37bfab93 refactor(connlib): Remove unused on_error callback (#3162)
Fixes #3161 
Fixes #2867
2024-01-11 12:42:41 +00:00
Jamil
1251397651 fix(ios/android): Pass device name and os version as overrides over connect (#3036)
Fixes #3035 
Fixes #3037 

# Before

<img width="738" alt="Screenshot 2023-12-28 at 8 05 31 AM"
src="https://github.com/firezone/firezone/assets/167144/c7ab4d74-672c-4536-97fe-f75d8d158bfb">

<img width="546" alt="Screenshot 2023-12-28 at 6 12 30 PM"
src="https://github.com/firezone/firezone/assets/167144/1bd4ba98-d11d-4277-bd14-b0afcdf78119">

# After

<img width="742" alt="Screenshot 2023-12-28 at 10 48 31 AM"
src="https://github.com/firezone/firezone/assets/167144/96054f82-069f-47f7-862c-986455ef76c0">
<img width="744" alt="Screenshot 2023-12-28 at 6 29 37 PM"
src="https://github.com/firezone/firezone/assets/167144/4ffc19b6-7c87-4ccb-bcfe-cb0e76fe95b7">
2024-01-03 20:08:33 +00:00
Gabi
5edfe80eb0 connlib: tune disconnect parameters (#2977)
Should fix #2946 (still testing, trying to reproduce the error reported
in the issue)
2023-12-21 19:37:07 +00:00
Jamil
aabc06c3c1 Fix java method signature bug (#2950)
Fixes a bug introduced in the DNS stuff

Co-authored-by: Reactor Scram <ReactorScram@users.noreply.github.com>
2023-12-19 19:54:13 +00:00
Jamil
8499580388 Remove Apple SplitDNS in favor of unified split DNS approach (#2894)
<img width="1552" alt="Screenshot 2023-12-12 at 11 29 43 PM"
src="https://github.com/firezone/firezone/assets/167144/d517c830-64a8-462d-8cb5-c41835fa2059">

Found a reliable way to return default system DNS resolvers on iOS and
macOS. Even if this method is not perfect, I think it's still worth
pursuing because:

* Many administrators will set an upstream resolver in the portal anyway
(bypassing client system resolvers)
* It unifies our Split DNS approach across platforms (assuming we can
query the default system resolvers on Windows), allowing connlib to
intercept all DNS queries on all platforms. This opens the door for some
interesting feature possibilities in the area of malicious query
blocking. This also makes DNS bugs easier to investigate because there's
only one codepath for packets to take. See
https://github.com/firezone/firezone/issues/2859

Draft because it needs more testing and I need to figure out the
`RustVec<RustString>` type for the Swift -> Rust FFI.

Refs #2713
2023-12-13 22:01:00 +00:00
Jamil
2bca378f17 Allow data plane configuration at runtime (#2477)
## Changelog

- Updates connlib parameter API_URL (formerly known under different
names as `CONTROL_PLANE_URL`, `PORTAL_URL`, `PORTAL_WS_URL`, and
friends) to be configured as an "advanced" or "hidden" feature at
runtime so that we can test production builds on both staging and
production.
- Makes `AUTH_BASE_URL` configurable at runtime too
- Moves `CONNLIB_LOG_FILTER_STRING` to be configured like this as well
and simplifies its naming
- Fixes a timing attack bug on Android when comparing the `csrf` token
- Adds proper account ID validation to Android to prevent invalid URL
parameter strings from being saved and used
- Cleans up a number of UI / view issues on Android regarding typos,
consistency, etc
- Hides vars from from the `relay` CLI we may not want to expose just
yet
- `get_device_id()` is flawed for connlib components -- SMBios is rarely
available. Data plane components now require a `FIREZONE_ID` now instead
to use for upserting.


Fixes #2482 
Fixes #2471

---------

Signed-off-by: Jamil <jamilbk@users.noreply.github.com>
Co-authored-by: Gabi <gabrielalejandro7@gmail.com>
2023-10-30 23:46:53 -07:00
Gabi
d626f6dbf6 Connlib/forward dns (#2325)
With this we implement DNS forwarding that's specified in  #2043 

This also solve the DNS story in Android.

For the headless client in Linux we still need to implement split dns,
but we can make do with this, specially, we can read from resolvconf and
use the forward DNS (not ideal but can work if we want a beta headless
client).

For the resolver I used `trusted-proto-resolver`.

The other options were:

* Using `domain`'s resolver but while it could work for now, it's no
ideal for this since it doesn't support DoH or DoT and doesn't provide
us with a DNS cache.
* Using `trusted-proto-client`, it doesn't provide us with a DNS cache,
though we could eventually replace it since it provides a way to access
the underlying buffer which could make our code a bit simpler.
* Writing our own. While we could make the API ideal, this is too much
work for beta.


@pratikvelani I did some refactor in the kotlin side so we can return an
array of bytearrays so that we don't require parsing on connlib side, I
also tried to make the dns server detector a bit simpler please take a
look it's my first time doing kotlin

@thomaseizinger please take a look specially at the first commit, I
tried to integrate with the `poll_events` and the `ClientState`.
2023-10-18 20:39:20 +00:00
Jamil
00e77062b1 Return fd onRemoveRoute as well (#2296)
Implements the function signatures for `onRemoveRoute` as well.

Getting this error still though:

<img width="1633" alt="Screenshot 2023-10-10 at 8 25 17 AM"
src="https://github.com/firezone/firezone/assets/167144/3dc09f1b-10e1-401b-a1ef-64f1a09e35d5">

Android simulator, Pixel, API 34
2023-10-10 11:26:53 -07:00
Gabi
e516bcc8dd connlib+android: enable fd replacement (#2235)
Should be easier to review commit by commit.

The gist of this commit is:
* `onAddRoute` on Android now takes an address+prefix as to minimize
parsing
* `onAddRoute` recreates the vpn service each time(TODO: is this too bad
for performance?)
* `on_add_route` and `onAddRoute` returns the new fd
* on android after `on_add_route` we recreate `IfaceConfig` and
`DeviceIo` and we store the new values
* `peer_handler` now runs on a loop, where each time we fail a write
with an error code 9(bad descriptor) we try to take the new `DeviceIo`
* we keep an
[`AbortHandle`](https://docs.rs/tokio/latest/tokio/task/struct.AbortHandle.html)
from the `iface_handler` task, since closing the fd doesn't awake the
`read` task for `AsyncFd`(I tried it, right now `close` is only called
after dropping the fd) so we explicitly abort the task and start a new
one with the new `device_io`.
* in android `DeviceIo` has an atomic which tells if it's closed or open
and we change it to closed after `on_add_route`, we use this as to never
double-close the fd, instead we wait until it's dropped. This *might*
affect performance on android since we use non-`Ordering::Relaxed`
atomic operation each read/write but it won't affect perfromance in
other platforms, furthermore I believe the performance gains if we
remove this will be minimal.

Fixes #2227

---------

Co-authored-by: Jamil <jamilbk@users.noreply.github.com>
2023-10-08 23:52:45 -03:00
Thomas Eizinger
464efbad56 refactor(connlib): restructure directory for consistency (#2236) 2023-10-05 09:52:35 +11:00
Thomas Eizinger
bb9dc1aeac feat: upload logs to GCP on compile-time configurable interval (#2103)
Resolves: #2020.

---------

Co-authored-by: Jamil Bou Kheir <jamilbk@users.noreply.github.com>
2023-09-29 00:03:03 +00:00
Jamil
3baf2ee1bb feat(connlib): Wrap secrets in Secret to minimize chance of leakage (#2159)
Fixes #2085

---------

Co-authored-by: Thomas Eizinger <thomas@eizinger.io>
2023-09-28 18:35:16 +00:00
Thomas Eizinger
1dc739505b refactor: simplify headless-utils (#2151)
Commit-by-commit review is recommended.

---------

Co-authored-by: Jamil <jamilbk@users.noreply.github.com>
2023-09-26 20:54:00 +00:00
Thomas Eizinger
5d6dfc0c3a refactor(android): prefer early-exit for error paths (#2127)
Instead of using combinators or early-exiting on _success_, use `?` and
keep the data flow of the FFI function focused on the happy path.

I find code easier to read if the left-most indentation is the happy
path and any further indentations are errors that exit early from the
function.
2023-09-25 20:56:16 +00:00
Gabi
5a998f7373 connlib: add logging string configuration (#2115)
Split from #2104

This adds logging string configuration, unifies behavior between gateway
and headless clients and some cli improvements for those.

---------

Signed-off-by: Gabi <gabrielalejandro7@gmail.com>
Co-authored-by: Jamil <jamilbk@users.noreply.github.com>
2023-09-25 20:17:22 +00:00
Thomas Eizinger
80f71fd9da refactor(connlib): don't store WorkerGuard in Session (#2125)
The various client platforms are too different in how they handle
logging. Contrary to what I suggested in the initial PR, I no longer
think that storing the guard within the session is a good idea.

For the headless client for example, we block on CTRL+C anyway and thus
can simplify have the guard stay alive for the entirety of the program.
For Apple, we can store the guard in the `WrappedSession`. For Android,
we store it in a static variable anyway.

Lastly, whilst working on the log-upload, I've encountered circular
dependencies caused by this as I would have to store more than just the
`WorkerGuard` in the `Session`.
2023-09-25 15:03:56 +00:00
Thomas Eizinger
57809f20b0 refactor(connlib): move static LOGGING_GUARD to init_logging function (#2124)
Static variables can be declared within functions if that is their only
scope. Reducing the scope of variables makes it easier to understand the
code.
2023-09-25 01:01:13 +00:00
Jamil
713c34e496 fix(connlib): Persist logging guard for the duration of the session (#2058)
This allows the file logger to write events as they're emitted so that
we (attempt to) capture everything for the lifetime of the session.

Sample:

```json
{"time":"2023-09-13T13:28:26.396615Z","target":"libs_common::session","logging.googleapis.com/sourceLocation":{"file":"connlib/libs/common/src/session.rs","line":"324"},"severity":"DEBUG","message":"Attempting connection to portal..."}
{"time":"2023-09-13T13:28:26.436317Z","target":"log","severity":"DEBUG","logFile":"/Users/jamil/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rustls-0.21.7/src/client/hs.rs","logLine":73,"logModulePath":"rustls::client::hs","logTarget":"rustls::client::hs","message":"No cached session for DnsName(\"api.firez.one\")"}
{"time":"2023-09-13T13:28:26.43694Z","target":"log","severity":"DEBUG","logFile":"/Users/jamil/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rustls-0.21.7/src/client/hs.rs","logLine":132,"logModulePath":"rustls::client::hs","logTarget":"rustls::client::hs","message":"Not resuming any session"}
{"time":"2023-09-13T13:28:26.446781Z","target":"log","severity":"DEBUG","logFile":"/Users/jamil/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rustls-0.21.7/src/client/hs.rs","logLine":615,"logModulePath":"rustls::client::hs","logTarget":"rustls::client::hs","message":"Using ciphersuite TLS13_AES_256_GCM_SHA384"}
{"time":"2023-09-13T13:28:26.447046Z","target":"log","severity":"DEBUG","logFile":"/Users/jamil/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rustls-0.21.7/src/client/tls13.rs","logLine":142,"logModulePath":"rustls::client::tls13","logTarget":"rustls::client::tls13","message":"Not resuming"}
{"time":"2023-09-13T13:28:26.449001Z","target":"log","severity":"DEBUG","logFile":"/Users/jamil/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rustls-0.21.7/src/client/tls13.rs","logLine":381,"logModulePath":"rustls::client::tls13","logTarget":"rustls::client::tls13","message":"TLS1.3 encrypted extensions: []"}
{"time":"2023-09-13T13:28:26.449266Z","target":"log","severity":"DEBUG","logFile":"/Users/jamil/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rustls-0.21.7/src/client/hs.rs","logLine":472,"logModulePath":"rustls::client::hs","logTarget":"rustls::client::hs","message":"ALPN protocol is None"}
{"time":"2023-09-13T13:28:26.544357Z","target":"libs_common::session","logging.googleapis.com/sourceLocation":{"file":"connlib/libs/common/src/session.rs","line":"327"},"severity":"WARNING","error":"PortalConnectionError(Http(Response { status: 404, version: HTTP/1.1, headers: {\"cache-control\": \"max-age=0, private, must-revalidate\", \"content-length\": \"9\", \"date\": \"Wed, 13 Sep 2023 13:28:25 GMT\", \"server\": \"Cowboy\", \"strict-transport-security\": \"max-age=63072000; includeSubDomains; preload\", \"x-request-id\": \"F4R4XmBOoVfqEVkAAAVh\", \"via\": \"1.1 google\", \"alt-svc\": \"h3=\\\":443\\\"; ma=2592000,h3-29=\\\":443\\\"; ma=2592000\", \"connection\": \"close\"}, body: Some([78, 111, 116, 32, 102, 111, 117, 110, 100]) }))","message":"Portal connection error"}
{"time":"2023-09-13T13:28:26.544838Z","target":"libs_common::session","logging.googleapis.com/sourceLocation":{"file":"connlib/libs/common/src/session.rs","line":"330"},"severity":"WARNING","message":"Error connecting to portal, retrying in 42 seconds"}
{"time":"2023-09-13T13:28:36.087416Z","target":"tunnel_state","logging.googleapis.com/sourceLocation":{"file":"connlib/libs/client/src/control.rs","line":"255"},"severity":"DEBUG","message":"TunnelStats {\n    public_key: \"BQCIkQ7iNdQxEnZo6lGwR8prKJgMlJGL+UPj+C50J0s=\",\n    peers_by_ip: {},\n    peer_connections: [\n        7482154e-107d-4981-8f5e-4becf1a9bfd2,\n    ],\n    resource_gateways: {\n        2a39fb5e-f7f4-44da-9163-5675c009a2ae: 7482154e-107d-4981-8f5e-4becf1a9bfd2,\n    },\n    dns_resources: {},\n    network_resources: {\n        V4(\n            Ipv4Network {\n                network_address: 172.31.83.10,\n                netmask: 32,\n            },\n        ): Cidr(\n            ResourceDescriptionCidr {\n                id: 01c6a1ea-2540-4ec8-9caa-0015ddfffb55,\n                address: V4(\n                    Ipv4Network {\n                        network_address: 172.31.83.10,\n                        netmask: 32,\n                    },\n                ),\n                name: \"TCP / UDPbin\",\n            },\n        ),\n        V4(\n            Ipv4Network {\n                network_address: 172.31.92.238,\n                netmask: 32,\n            },\n        ): Cidr(\n            ResourceDescriptionCidr {\n                id: 115ab626-ac3e-4890-b613-07f90bc1afb3,\n                address: V4(\n                    Ipv4Network {\n                        network_address: 172.31.92.238,\n                        netmask: 32,\n                    },\n                ),\n                name: \"Performance Testing\",\n            },\n        ),\n        V4(\n            Ipv4Network {\n                network_address: 172.31.82.179,\n                netmask: 32,\n            },\n        ): Cidr(\n            ResourceDescriptionCidr {\n                id: 2a39fb5e-f7f4-44da-9163-5675c009a2ae,\n                address: V4(\n                    Ipv4Network {\n                        network_address: 172.31.82.179,\n                        netmask: 32,\n                    },\n                ),\n                name: \"HTTPbin\",\n            },\n        ),\n        V4(\n            Ipv4Network {\n                network_address: 172.31.93.123,\n                netmask: 32,\n            },\n        ): Cidr(\n            ResourceDescriptionCidr {\n                id: 196b9f86-0789-4c2e-8afd-3b3cd59e1462,\n                address: V4(\n                    Ipv4Network {\n                        network_address: 172.31.93.123,\n                        netmask: 32,\n                    },\n                ),\n                name: \"IPerf3\",\n            },\n        ),\n    },\n    gateway_public_keys: {},\n    awaiting_connection: {\n        2a39fb5e-f7f4-44da-9163-5675c009a2ae: AwaitingConnectionDetails {\n            total_attemps: 31,\n            response_received: true,\n        },\n    },\n    gateway_awaiting_connection: {\n        7482154e-107d-4981-8f5e-4becf1a9bfd2: [],\n    },\n}"}
{"time":"2023-09-13T13:28:46.087297Z","target":"tunnel_state","logging.googleapis.com/sourceLocation":{"file":"connlib/libs/client/src/control.rs","line":"255"},"severity":"DEBUG","message":"TunnelStats {\n    public_key: \"BQCIkQ7iNdQxEnZo6lGwR8prKJgMlJGL+UPj+C50J0s=\",\n    peers_by_ip: {},\n    peer_connections: [\n        7482154e-107d-4981-8f5e-4becf1a9bfd2,\n    ],\n    resource_gateways: {\n        2a39fb5e-f7f4-44da-9163-5675c009a2ae: 7482154e-107d-4981-8f5e-4becf1a9bfd2,\n    },\n    dns_resources: {},\n    network_resources: {\n        V4(\n            Ipv4Network {\n                network_address: 172.31.82.179,\n                netmask: 32,\n            },\n        ): Cidr(\n            ResourceDescriptionCidr {\n                id: 2a39fb5e-f7f4-44da-9163-5675c009a2ae,\n                address: V4(\n                    Ipv4Network {\n                        network_address: 172.31.82.179,\n                        netmask: 32,\n                    },\n                ),\n                name: \"HTTPbin\",\n            },\n        ),\n        V4(\n            Ipv4Network {\n                network_address: 172.31.83.10,\n                netmask: 32,\n            },\n        ): Cidr(\n            ResourceDescriptionCidr {\n                id: 01c6a1ea-2540-4ec8-9caa-0015ddfffb55,\n                address: V4(\n                    Ipv4Network {\n                        network_address: 172.31.83.10,\n                        netmask: 32,\n                    },\n                ),\n                name: \"TCP / UDPbin\",\n            },\n        ),\n        V4(\n            Ipv4Network {\n                network_address: 172.31.92.238,\n                netmask: 32,\n            },\n        ): Cidr(\n            ResourceDescriptionCidr {\n                id: 115ab626-ac3e-4890-b613-07f90bc1afb3,\n                address: V4(\n                    Ipv4Network {\n                        network_address: 172.31.92.238,\n                        netmask: 32,\n                    },\n                ),\n                name: \"Performance Testing\",\n            },\n        ),\n        V4(\n            Ipv4Network {\n                network_address: 172.31.93.123,\n                netmask: 32,\n            },\n        ): Cidr(\n            ResourceDescriptionCidr {\n                id: 196b9f86-0789-4c2e-8afd-3b3cd59e1462,\n                address: V4(\n                    Ipv4Network {\n                        network_address: 172.31.93.123,\n                        netmask: 32,\n                    },\n                ),\n                name: \"IPerf3\",\n            },\n        ),\n    },\n    gateway_public_keys: {},\n    awaiting_connection: {\n        2a39fb5e-f7f4-44da-9163-5675c009a2ae: AwaitingConnectionDetails {\n            total_attemps: 31,\n            response_received: true,\n        },\n    },\n    gateway_awaiting_connection: {\n        7482154e-107d-4981-8f5e-4becf1a9bfd2: [],\n    },\n}"}
{"time":"2023-09-13T13:28:53.703612Z","target":"log","severity":"WARNING","logFile":"/Users/jamil/.cargo/git/checkouts/webrtc-316f277f555c12ed/672e728/mdns/src/conn/mod.rs","logLine":359,"logModulePath":"webrtc_mdns::conn","logTarget":"webrtc_mdns::conn","message":"Failed to parse mDNS packet parsing/packing of this type isn't available yet"}
{"time":"2023-09-13T13:28:54.709612Z","target":"log","severity":"WARNING","logFile":"/Users/jamil/.cargo/git/checkouts/webrtc-316f277f555c12ed/672e728/mdns/src/conn/mod.rs","logLine":359,"logModulePath":"webrtc_mdns::conn","logTarget":"webrtc_mdns::conn","message":"Failed to parse mDNS packet parsing/packing of this type isn't available yet"}
{"time":"2023-09-13T13:28:56.086942Z","target":"tunnel_state","logging.googleapis.com/sourceLocation":{"file":"connlib/libs/client/src/control.rs","line":"255"},"severity":"DEBUG","message":"TunnelStats {\n    public_key: \"BQCIkQ7iNdQxEnZo6lGwR8prKJgMlJGL+UPj+C50J0s=\",\n    peers_by_ip: {},\n    peer_connections: [\n        7482154e-107d-4981-8f5e-4becf1a9bfd2,\n    ],\n    resource_gateways: {\n        2a39fb5e-f7f4-44da-9163-5675c009a2ae: 7482154e-107d-4981-8f5e-4becf1a9bfd2,\n    },\n    dns_resources: {},\n    network_resources: {\n        V4(\n            Ipv4Network {\n                network_address: 172.31.82.179,\n                netmask: 32,\n            },\n        ): Cidr(\n            ResourceDescriptionCidr {\n                id: 2a39fb5e-f7f4-44da-9163-5675c009a2ae,\n                address: V4(\n                    Ipv4Network {\n                        network_address: 172.31.82.179,\n                        netmask: 32,\n                    },\n                ),\n                name: \"HTTPbin\",\n            },\n        ),\n        V4(\n            Ipv4Network {\n                network_address: 172.31.93.123,\n                netmask: 32,\n            },\n        ): Cidr(\n            ResourceDescriptionCidr {\n                id: 196b9f86-0789-4c2e-8afd-3b3cd59e1462,\n                address: V4(\n                    Ipv4Network {\n                        network_address: 172.31.93.123,\n                        netmask: 32,\n                    },\n                ),\n                name: \"IPerf3\",\n            },\n        ),\n        V4(\n            Ipv4Network {\n                network_address: 172.31.83.10,\n                netmask: 32,\n            },\n        ): Cidr(\n            ResourceDescriptionCidr {\n                id: 01c6a1ea-2540-4ec8-9caa-0015ddfffb55,\n                address: V4(\n                    Ipv4Network {\n                        network_address: 172.31.83.10,\n                        netmask: 32,\n                    },\n                ),\n                name: \"TCP / UDPbin\",\n            },\n        ),\n        V4(\n            Ipv4Network {\n                network_address: 172.31.92.238,\n                netmask: 32,\n            },\n        ): Cidr(\n            ResourceDescriptionCidr {\n                id: 115ab626-ac3e-4890-b613-07f90bc1afb3,\n                address: V4(\n                    Ipv4Network {\n                        network_address: 172.31.92.238,\n                        netmask: 32,\n                    },\n                ),\n                name: \"Performance Testing\",\n            },\n        ),\n    },\n    gateway_public_keys: {},\n    awaiting_connection: {\n        2a39fb5e-f7f4-44da-9163-5675c009a2ae: AwaitingConnectionDetails {\n            total_attemps: 31,\n            response_received: true,\n        },\n    },\n    gateway_awaiting_connection: {\n        7482154e-107d-4981-8f5e-4becf1a9bfd2: [],\n    },\n}"}
{"time":"2023-09-13T13:28:57.52105Z","target":"firezone_tunnel::tun","logging.googleapis.com/sourceLocation":{"file":"connlib/libs/tunnel/src/tun_darwin.rs","line":"224"},"severity":"DEBUG","message":"MTU for utun7 is 1420"}
```


Sample log attached:


[connlib.log.zip](https://github.com/firezone/firezone/files/12598066/connlib.log.zip)
2023-09-20 17:21:09 +00:00
Jamil
40b62448e2 feat(connlib): Add file_logger module and configure via connect (#1973)
Implements the FFI part of the following issues:

Fixes firezone/product#669
Refs firezone/product#672
Refs firezone/product#673

~~Log wg stats as well by moving into warn category.~~ This contains
information we want to keep out of our logging infrastructure for now.
2023-09-11 16:50:48 -07:00
Jamil
ce11fa29f0 fix(clients): SHA256 external_id to normalize before sending to portal (#1949)
* Normalizes very long or very short device IDs to a predictable length
* Ensures uniform distribution for the DB index
* Provides some basic level of privacy preservation
2023-08-29 03:24:01 +00:00
Jamil
4d84e1f12e chore(connlib): Add external ID to FFI, return fd in on_set_interface_config (#1945)
(Supersedes #1944)

* Fixes https://github.com/firezone/product/issues/649
* Passes `dns_fallback_strategy` over FFI (these are hardcoded for now)
* Incorporates @conectado 's #1944 and cleans up a few places `fd` was
still passed

Draft for now until I can test it more tomorrow

---------

Co-authored-by: conectado <gabrielalejandro7@gmail.com>
2023-08-25 15:44:08 -07:00
Jamil
3316d9098a fix(android): Fix auth flow and callback thread safety, and pass fd through FFI (#1930)
* Refactor sharedPreferences to only save the AccountId
* Update TeamId -> AccountId to match naming elsewhere
* Update JWT -> Token to avoid confusion; this token is **not** a valid
JWT and should be treated as an opaque token
* Update FFI `connect` to accept an optional file descriptor (int32) as
a first argument. This seemed to be the most straightforward way to pass
it to the tunnel stack. Retrieving it via callback is another option,
but retrieving return vars with the `jni` was more complex. We could
have used a similar approach that we did in the Apple client
(enumerating all fd's in the `new()` function until we found ours) but
this approach is [explicitly
documented/recommended](https://developer.android.com/reference/android/net/VpnService.Builder#establish())
by the Android docs so I figured it's not likely to break.

Additionally, there was a thread safety bug in the recent JNI callback
implementation that consistently crashed the VM with `JNI DETECTED ERROR
IN APPLICATION: use of invalid jobject...`. The fix was to use
`GlobalRef` which has the explicit purpose of outliving the `JNIEnv`
lifetime so that no `static` lifetimes need to be used.

---------

Signed-off-by: Jamil <jamilbk@users.noreply.github.com>
Co-authored-by: Pratik Velani <pratikvelani@gmail.com>
Co-authored-by: Gabi <gabrielalejandro7@gmail.com>
2023-08-23 14:13:55 -07:00
Jamil
01906ba507 android: Update auth URLs to follow convention; Fix JNI callback method signatures (#1870) 2023-08-09 06:47:25 -05:00
Francesca Lovebloom
bc3a5d9e54 connlib: JNI bridge (#1848)
The biggest internal change is that all the methods on `Callbacks` (on
the Rust side!) return a `Result` now, so errors from the bridge or even
the client callbacks will be handled.

@roop there's nothing for you to review here, but note:

- the `bool` return values you've asked about in the past are gone now
- the route string for `onAddRoute`/`onRemoveRoute` no longer has the
extra quotes (it's no longer JSON)

---------

Signed-off-by: Francesca Lovebloom <franlovebloom@gmail.com>
Co-authored-by: Jamil <jamilbk@users.noreply.github.com>
2023-08-07 19:03:28 -05:00
Jamil
561e8ee0cf Remove erroneously copied functions from connlib apple (#1845)
Removes functions from the android FFI that aren't needed. Why? These
were mistakenly copied from the apple FFI when I was prototyping this
back in April.
2023-08-04 04:54:42 +00:00
Francesca Lovebloom
9d4df04501 connlib: Simpler FFI (#1823)
As per discussion from the client sync,
- this removes `TunnelAddresses` in favor of simply passing the IPv4 and
IPv6 addresses as two separate strings.
- this changes `onDisconnect`'s semantics to be called _after_
disconnect instead of before.

Additionally, as per earlier discussion, errors are now passed as
strings. These errors already weren't intended to be actionable on the
client side, so the ability to handle them programmatically is
unnecessary. When internationalization is added down the road, we'll
likely replace these with error codes for looking up localized strings;
until then, this design improves diagnostics and reduces complexity.

Closes #1796
Closes #1822
2023-07-29 23:47:39 +00:00
Francesca Lovebloom
9fb842ed24 connlib: Fix resource list JSON (#1818)
Addresses one of the issues raised in firezone/product#634

Previously, we were joining a `Vec` of serialized JSON objects into a
comma-separated string, which isn't valid JSON. Now the entire thing is
simply serialized, `Vec` and all.

Additionally, I've moved serialization to happen just before the FFI
boundary, which removes some indirection from connlib and will avoid a
deserialization step when writing non-FFI clients.
2023-07-24 23:17:43 +00:00
Francesca Lovebloom
e5e18e78a3 connlib: Disconnect on fatal error (#1801)
Resolves firezone/product#619

This additionally removes `ErrorType`:
- `on_error` is now exclusively used for recoverable errors, and no
longer has an `error_type` parameter.
- `on_disconnect` now has an optional `error` parameter, which specifies
the fatal error that caused the disconnect if relevant.
2023-07-19 22:36:06 +00:00
Francesca Lovebloom
e413e96ccb connlib: Refine callbacks (#1776)
This follows-up on the discussion in #1744 and brings connlib in line
with the callback revisions outlined in firezone/product#586

(It also adds some logging to the Apple bridge that was helpful when
testing this)

---------

Co-authored-by: Roopesh Chander <roop@roopc.net>
Co-authored-by: Jamil <jamilbk@users.noreply.github.com>
2023-07-17 18:26:46 +00:00
Francesca Lovebloom
a4810986c7 connlib: Improve FFI bridges for Apple and Android (#1691)
This makes it possible to build the Apple/Android FFI bridges and
integrate them with their respective client apps.

---------

Signed-off-by: Francesca Lovebloom <franlovebloom@gmail.com>
Co-authored-by: Roopesh Chander <roop@roopc.net>
2023-06-28 11:29:59 -06:00
Gabi
e9be4b9ef5 connlib: moves it to the main firezone library
This brindgs connlib from its own separated repo to firezone's monorepo.
    
 On top of bringing connlib we also add and unify the Dockerfile for all
 rust binaries and add a docker-compose that can run a headless client, a
 relay and a gateway which eventually will test the whole flow between a
 client and a resource. For this to work we also incorporated some elixir
 scripts to generate portal tokens for those components.
2023-06-23 16:39:58 -06:00