Commit Graph

208 Commits

Author SHA1 Message Date
Jamil
635b0f37cc refactor(apple): Determine logging context based on bundle ID (#7618)
This simplifies the logging API and prevents accidentally writing to the
app or tunnel log file from the wrong process.

Tested on macOS and iOS

Fixes #7616 

Draft because stacked
2024-12-31 20:59:22 +00:00
Jamil
b5eccf095a refactor(apple): Remove redundant category key from log files (#7614)
This is redundant and makes logs unnecessarily more noisy / larger.

Fixes #7613
2024-12-31 19:44:00 +00:00
Jamil
1ddc2f5de6 fix(apple): Don't crash if tunnel manager session is unexpectedly nil (#7594)
In certain weird edge cases such as:

- The user removes the VPN profile while Firezone is signed in, causing
the `NETunnelProviderSession` to go invalid immediately
- The user approves the system extension to load before the VPN profile
access is granted

then the TunnelManager will not be able to obtain a valid reference to a
NETunnelProviderSession object.

In these cases, for now, it makes more sense to fail silently than to
crash, effectively making these operations a no-op until the user
remedies the VPN profile. Currently the user is prompted to re-grant VPN
profile whenever its status goes to `invalid`, so these cases don't
technically fail without prompting the user.

Draft because it's stacked on #7593 


Fixes #7579 
Fixes #7591

---------

Signed-off-by: Jamil <jamilbk@users.noreply.github.com>
Co-authored-by: Thomas Eizinger <thomas@eizinger.io>
2024-12-30 20:14:56 +00:00
Jamil
a1337d011c fix(apple): Load tunnel manager after creating it (#7593)
When launching Firezone for the first time, the VPN profile doesn't
exist. We prompt the user to create it with "Grant VPN Permission", but
then we fail to reload it, which initializes the tunnelManager instance
variables properly and binds observers.

The result of this was that we failed to react to VPN status changes on
the first launch of Firezone.

This can (and should be) refactored to be cleaner, but that is out of
scope for this PR and will be saved for #6554.


Refs #7579
2024-12-30 19:08:40 +00:00
Jamil
019d9b6749 fix(apple/iOS): Use separate Info.plist for iOS and macOS Network Extensions (#7609)
macOS and iOS require slightly different Info.plist values for the
Network Extension.

Fixes a regression introduced in #7602
2024-12-30 18:04:10 +00:00
Jamil
086dd5188c chore(apple): Resolve all Swift compile warnings (#7602)
Fixes various warnings Xcode that have cropped up in the 1.4.0 refactor
and recent feature additions.
2024-12-30 17:12:05 +00:00
Jamil
1c2c350b8f docs: update Apple docs for standalone guidance (#7589)
Updated the swift/apple README with new added tips for making release
builds from your local machine.

refs #7581

---------

Signed-off-by: Jamil <jamilbk@users.noreply.github.com>
Co-authored-by: Thomas Eizinger <thomas@eizinger.io>
2024-12-29 21:36:30 +00:00
Jamil
f9c2001adb docs: Update note on developer ID certificate to mention getting it from 1Pass (#7586)
Developer ID certificates are precious. Apple only allows a limited
number of them per account, and once generated, they cannot be revoked.
They are also not compatible with automatic signing and provisioning in
Xcode due in part to the above reasons.

---------

Signed-off-by: Jamil <jamilbk@users.noreply.github.com>
Co-authored-by: Thomas Eizinger <thomas@eizinger.io>
2024-12-29 08:46:36 +00:00
Jamil
0c38409588 ci: Add standalone macOS build support (#7581)
The CI swift workflow needs to be updated to accommodate the macOS
standalone build. This required a decent amount of refactoring to make
the Apple build process more maintainable.

Unfortunately this PR ended up being a giant ball of yarn where pulling
on one thread tended to unravel things elsewhere, since building the
Apple artifacts involve multiple interconnected systems. Combined with
the slow iteration of running in CI, I wasn't able to split this PR into
easier to digest commits, so I've annotated the PR as much as I can to
explain what's changed.

The good news is that Apple release artifacts can now be easily built
from a developer's machine with simply
`scripts/build/macos-standalone.sh`. The only thing needed is the proper
provisioning profiles and signing certs installed.

Since this PR is so big already, I'll save the swift/apple/README.md
updates for another PR.
2024-12-28 22:28:09 +00:00
Jamil
dc9d34cf84 docs: Add developer instructions for testing standalone macos builds (#7580)
Because the macOS standalone app doesn't go through the same vetting
process as the App Store build, it's a good idea to smoke test it
occasionally. This PR adds instructions for doing so.
2024-12-25 10:34:51 +00:00
Jamil
56e8d98276 chore(apple/macOS): Add dedicated xcconfig for standalone distribution (#7578)
Standalone distribution requires using a different signing identity
(certificate), set of provisioning profiles, and (annoyingly) requires
the `-systemextension` suffix for our network extension capabilities.

This PR prepares the Xcode environment for building a Standalone app in
CI that will be notarized by matching certificates and provisioning
profiles in our Apple Developer account.
2024-12-24 22:57:06 +00:00
Jamil
e9c0721674 fix(apple/macOS): Fetch providerStopReason over IPC on macOS (#7570)
Since we no longer have access to the tunnel's group container from the
app process, we need to move reading the last VPN stop reason to an IPC
call. This call is used to show an alert to the user when their connlib
session has been disconnected due to 401: Unauthorized.

Fixes #7468
2024-12-23 11:55:36 +00:00
Jamil
be21889165 fix(apple): Make log export work over IPC for macOS (#7535)
Exporting logs on macOS in >= 1.4.0 presents a challenge because the app
process and tunnel process now write to different directories. They do
this because the network extension is now packaged as a system
extension, which means it runs as root.

Since the Apple App Store requires apps to be sandboxed, and we don't
wish to break App Store compatibility just yet, the tunnel process and
app process can't read or write to a common shared directory anymore.

This leaves IPC as the only reliable means for app <-> tunnel
communication. We already use the provided `sendProviderMessage`
function exposed by Network Extension for other operations, so we add
another message type to handle log export.

The log archive from the tunnel needs to be sent in chunks to reduce the
amount of total memory the export process consumes. To facilitate this,
a custom TunnelLogArchive class is used which handles the business logic
of keeping a pointer into the file we're chunking over.

As each chunk is read from the tunnel log archive, we send it using the
`sendProviderMessage`'s completionHandler callback. If the number of
sent bytes is less than our maximum chunk size, we know we're done.

On the app side, we read each chunk of data from the tunnel process
until a `done` boolean is signaled, at which point we close the archive
file we're writing to and complete the export.

Lastly, we need to compress the app and tunnel archives separately, then
compress the final result into a final archive path set by the user.
This is because it's impossible to compress two decoupled directories at
once.

Very little to any noticeable delay is added when performing this over
the previous approach. Exporting multiple GB of log data from the tunnel
took only a second or two on my M1. Presumably, having to read
uncompressed chunks and doing the compression on the app-side would
result in a couple orders of magnitude more IPC calls.

Refs #7071
2024-12-20 20:02:51 +00:00
Jamil
e6f5d6ef72 refactor(apple): Use static reference for TunnelManager instance (#7555)
Since we need to react to state on this instance changing, we need an
instance of TunnelManager to last the lifetime of the app process.

Thus, it makes more sense to use the `.shared` public static pattern to
maintain an instance of it we can use from anywhere instead of having to
store it in various other classes.
2024-12-20 16:35:05 +00:00
Jamil
56c592a27b fix(apple): Make clear logs and log size functions work across the IPC boundary (#7467)
The macOS client starting in 1.4.0 uses a system extension for its
network extension package type. This process runs as root and does not
have access to the app's Group Container folder for reading / writing
log files directly, and vice-versa. This means the tunnel now writes its
logs to a separate directory as the GUI app process.

Since the logging functions of clearing logs, calculating their size,
and exporting them assume all the logs are in the same directory, we
need to introduce IPC handlers to ensure the GUI app can conveniently
still perform these functions when initiated by the user.

We already use the Network Extension API `sendProviderMessage` as our
IPC mechanism for adhoc, bi-directional communication through the
tunnel, so we add more handlers to this mechanism to support the logging
functions summarized above.

In this PR we only fix the log size calculation and clear log
functionality. Exporting logs is more involved and will be implemented
in another dedicated PR.
2024-12-18 20:36:02 +00:00
Jamil
a7b8253766 chore(apple/xcode): Cache rust build more intelligently using build phase (#7488)
Xcode has decent support for skipping certain build phases when input
files haven't changed. This only happens for build phases within a
single target, and not for entire Target dependencies.

Before, we defined `Connlib` as its own bonafide build target, and then
added it as a target dependency for the network extension targets. This
causes Xcode to always run our `build-rust.sh` script, which takes
around 30s on my M1 even when `rust/` hasn't changed.

Instead, we can remove the `Connlib` target, and add a "Run script"
phase to the network extension targets themselves. By configuring the
input file list, Xcode will skip this phase if `rust/**/*.rs`,
`rust/**/*.toml` and `rust/Cargo.lock` haven't changed.

This makes it **much** faster to iterate on Swift code -- Xcode is
_very_ fast when building pure Swift (sometimes under < 1s).



<img width="1016" alt="Screenshot 2024-12-11 at 6 10 45 PM"
src="https://github.com/user-attachments/assets/29b5f073-3d58-4c07-9592-f9209033c966"
/>
2024-12-12 03:46:58 +00:00
Jamil
ac608d560a refactor(apple): Migrate firezone-id file to keychain (#7464)
Unlike the App extension which runs as the user, the system extension
introduced in macOS client 1.4.0 runs as `root` and thus cannot read the
App Group container directory for the GUI process. However, both
processes can read and write to the shared Keychain, which is how we
pass the token between the two processes already.

This PR does two things:

1. Tries to read an existing `firezone-id` from the pre-1.4.0 App Group
container upon app launch. This needs to be done from the GUI process.
If found, it stores it in the Keychain.
1. Refactors the `firezone-id` to be stored in the Keychain instead of a
plaintext file going forward.

The Keychain API is also cleaned up and abstracted to be more ergonomic
to use for both Token and Firezone ID storage purposes.
2024-12-09 03:17:46 +00:00
Jamil
0cdfd1fd4f fix(apple/macos): Install system extension on app launch (#7459)
- Installs the system extension on app launch instead of each time we
start the tunnel, as [recommended by
Apple](https://developer.apple.com/documentation/systemextensions/installing-system-extensions-and-drivers).
This will typically happen when the app is installed for the first time,
or upgraded / downgraded.
- Changes the completion handler functionality for observing the system
extension status to an observed property on the class. This allows us to
update the MenuBar based on the status of the installation, preventing
the user from attempting to sign in unless the system extension has been
installed.

~~This PR exposes a new, subtle issue - since we don't reinstall the
system extension on each startTunnel, the process stays running. This is
expected. However, now the logging handle needs to be maintained across
connlib sessions, similar to the Android tunnel lifetime.~~ Fixed in
#7460

Expect one or two more PRs to handle further edge cases with improved UX
as more testing with the release build and upgrade/downgrade workflows
are attempted.
2024-12-06 05:51:22 +00:00
Thomas Eizinger
48bd0f9804 chore: bump client versions to 1.4.0 (#7092)
In order to release the new control protocol to users, we need to bump
the versions of the clients to 1.4.0. The portal has a version gate to
only select gateways with version >= 1.4.0 for clients >= 1.4.0. Thus,
bumping these versions can only happen once testing has completed and
the gateway has actually been released as 1.4.0.

Co-authored-by: Jamil Bou Kheir <jamilbk@users.noreply.github.com>
2024-12-04 19:48:51 +00:00
Jamil
4233fb9490 fix(apple/macos): Add app sandbox and entitlements to network extension (#7455)
Apple
[requires](https://github.com/firezone/firezone/actions/runs/12161693820/job/33916881718)
network extensions on macOS to be sandboxed. Given this requirement, we
must explicitly allow both the `com.apple.security.network.client` and
`com.apple.security.network.security` entitlements for making outbound
network requests and for opening sockets respectively.
2024-12-04 19:11:40 +00:00
Jamil
bd3f912542 refactor(apple/macos): Use System Extension packaging mode for macOS Network Extension (#7344)
To allow macOS users to rollback, it would be helpful to distribute a
standalone macOS app, similar to how we distribute the GUI client.

The first step in this process is to refactor the macOS client to use a
System Extension -based Network Extension rather than an App Extension
based one. This offers us the flexibility to distribute the macOS client
outside the Mac App Store in addition to via the store.

For this PR I focused on making the minimal set of changes necessary to
support this change. This PR intentionally doesn't update the CI
pipeline to notarize and attach a standalone bundle that will run ad-hoc
on other Macs. That will come in a subsequent PR.

One thing to note about System Extensions is that they're slightly more
finicky when it comes to getting the signing and packaging right. Thus,
the README.md is updated to account for the gotchas involved in
developing System Extensions locally.

Related: #7071.
2024-12-04 05:34:25 +00:00
Jamil
1dda915376 ci: Publish new clients (#7291)
Fixes the roaming bug.
2024-11-08 22:58:06 +00:00
Thomas Eizinger
a5730b6f3b chore: release apple client 1.3.8 (#7268)
To be merged once Apple approves the app review.

---------

Co-authored-by: Jamil Bou Kheir <jamilbk@users.noreply.github.com>
2024-11-05 11:15:50 -08:00
Thomas Eizinger
59412223cb chore: bump Android and Apple apps to next version (#7192)
We are in the process of releasing these so we need to bump their
version to the next one.
2024-10-31 14:24:33 +00:00
Thomas Eizinger
05e895525b chore: set simpler default log filters (#7028)
Follow-up from #6985 to simplify our log filters everywhere. If any of
this doesn't fit, we should adjust the things here:


17ea827c03/rust/logging/src/lib.rs (L32-L40)
2024-10-14 18:54:36 +00:00
Jamil
613127d298 ci: Bump all clients and gateway (#6923)
Main fix: idle connection timing. These have already been released.

---------

Signed-off-by: Jamil <jamilbk@users.noreply.github.com>
2024-10-03 07:12:52 -07:00
Gabi
3501d5b287 feat(clients): use hardware id for device verification (#6857)
We want to associate additional device information for the device
verification, these are all parameters that tries to uniquely identify
the hardware.

For that reason we read system information and send it as part of the
query params to the portal, that way the portal can store this when
device is verified and match against that later on.

These are the parameters according to each platform:

|Platform|Query Field|Field Meaning|
|-----|----|-----|
|MacOS|`device_serial`|Hardware's Serial|
|MacOS| `device_uuid`|Hardware's UUID|
|iOS|`identifier_for_vendor`| Identifier for vendor, resets only on
uninstall/install|
|Android|`firebase_installation_id`| Firebase installation ID, resets
only on uninstall/install|
|Windows|`device_serial`|Motherboard's Serial|
|Linux|`device_serial`|Motherboard's Serial|


Fixes #6837
2024-10-02 08:44:26 +00:00
Jamil
d35a9c4615 fix(apple): Fix position of indicator dot on macOS (#6851)
This was a bit out of place on normal menubars.

<img width="155" alt="Screenshot 2024-09-27 at 7 53 35 AM"
src="https://github.com/user-attachments/assets/04deef1b-7098-4553-b228-44b43631b92c">
2024-09-27 16:07:13 +00:00
Jamil
e7dddee78f ci: bump android apple dns match (#6833)
Bumps Android -> 1.3.4, Apple -> 1.3.5

---------

Signed-off-by: Jamil <jamilbk@users.noreply.github.com>
2024-09-26 09:32:41 -07:00
Jamil
332a9fe352 ci: bump all clients to include fix for #6781 (#6820)
bump all clients to include #6781 fix

---------

Co-authored-by: Not Applicable <ReactorScram@users.noreply.github.com>
2024-09-25 19:27:50 +00:00
Jamil
4a1dc23a7e ci: Bump Apple and GUI versions (#6776)
Mainly to get DNS logging improvements out.
2024-09-19 07:13:33 -07:00
Jamil
7c806f7602 chore: Bump Apple to 1.3.2 (#6750)
Adds update notifications and fixes resource menu bug.
2024-09-19 01:40:38 +00:00
Gabi
9979f5a4e4 feat(macos): show notification updates (#6679)
This patch adds a notification for updates for macos clients when they
are on an old version.

This is how it looks:

<img width="497" alt="image"
src="https://github.com/user-attachments/assets/829044fd-e8bc-4b47-b64d-67b8ef72adb0">

The orange dot is shown regardless of the notification being dismissed.

If the notification is dismissed by the "Dismiss this version" button,
until there's no new version there won't be notifications.

Updates are check at the start of firezone and every 6 hours after. This
is saved in `UserDefaults`.

Permissions for notifications needs to be allowed so that it's show,
this should be done by the `requestAuthorization`

Also, when an update is available a new `Update available...` option
appears in the menu

<img width="230" alt="image"
src="https://github.com/user-attachments/assets/16d7fea8-3cf5-4711-9d42-5c49faffe6c8">

This option, same as the notification takes you to the appstore.

---------

Signed-off-by: Jamil <jamilbk@users.noreply.github.com>
Co-authored-by: Jamil <jamilbk@users.noreply.github.com>
2024-09-17 01:31:27 +00:00
Jamil
947db254cc fix(apple): Don't bold addressDescription in macOS Menubar (#6632)
When the addressDescription looks like a URI, we highlight it with
markdown and set its click handler to open the URL when clicked. We were
also making it bold, which seems to break macOS's menubar width
calculation, causing the field to truncate (typically after `https://`)
instead of expanding the container to contain it.

By removing the bold formatting, the container is properly sized, fixing
the display issue.


# Before
<img width="553" alt="Screenshot 2024-09-07 at 10 44 37 AM"
src="https://github.com/user-attachments/assets/4596bf54-918d-4a59-81d6-a18e436da5ad">

# After
<img width="569" alt="Screenshot 2024-09-07 at 10 45 38 AM"
src="https://github.com/user-attachments/assets/0400731f-e189-4416-a670-d5c3b314d71b">
2024-09-07 18:40:06 +00:00
Jamil
4c7daddf64 ci: Publish Apple/Android changelog entries (#6631)
These have been published.
2024-09-07 10:38:00 -07:00
Gabi
700b056cd2 fix(ui): make internet resource off by default (#6518)
With this PR we made internet resource disabled by default.

Since no other resource is disalable and internet resource behavior is
particular we remove all client code to make non internet resource
disalable.

Also, since the portal never makes the internet resource that can't be
disabled we remove the whole code path to handle that.

Additionally, some other smaller refactors across the UI wrt internet
resource

Fix #6509

---------

Signed-off-by: conectado <gabrielalejandro7@gmail.com>
Co-authored-by: conectado <conectado@conectados-MacBook-Air.local>
Co-authored-by: Thomas Eizinger <thomas@eizinger.io>
2024-09-04 19:16:50 +00:00
Jamil
cb061bf9ba fix(apple): Trigger connlib reset() when IPv4, IPv6, or available network gateways has changed (#6521)
On Apple, we try to be smart about triggering connlib's `reset()` in
order to keep from triggering endless update loops. This can happen
because connlib itself triggers path monitoring updates through
onUpdateRoutes and such.

Before, we only kept track of whether our primary interface changed in
order to consider the path updated. Now, we also track IPv4/IPv6
connectivity and the network's available gateways (read: routers) to
trigger changes. This fixes the case where our interface loses or gains
IPv4 / IPv6 connectivity, or the router address changes.

Fixes #6515

---------

Signed-off-by: Jamil <jamilbk@users.noreply.github.com>
Co-authored-by: Thomas Eizinger <thomas@eizinger.io>
2024-08-31 20:49:54 +00:00
Jamil
c6b0b0a922 ci: Release 1.3.0 for Internet Resource (#6503)
This publishes the 1.3.0 clients and gateways so that Internet Resources
will work.

The feature is still disabled for the Stripe plans until we publish the
launch post. Select customers have the feature enabled.

Closes #2667
2024-08-30 01:21:34 -07:00
Jamil
c66f0c15c0 ci: Draft bump 1.3.0 clients (#6470)
- Internet resources
2024-08-29 23:33:02 -07:00
Gabi
14b7652e0c chore(ui): move disable resource into resources details (#6463)
To homogenize the UI in mobile and non-mobile, we re-enable the sub-menu
for the internet resource, where it shows all resource

## New UI for android


![image](https://github.com/user-attachments/assets/3b9ce82f-1dbd-4ace-b7ba-873a34fd9dec)



![image](https://github.com/user-attachments/assets/16e9b128-532c-467e-b663-ae83195b2730)

## New UI for apple


![98579](https://github.com/user-attachments/assets/8bbda871-1d16-4d99-b873-a26d480821cf)


![99694](https://github.com/user-attachments/assets/f2924a08-8996-4882-867d-7446f7cfbafd)
2024-08-29 00:26:30 +00:00
Gabi
63c73e5bb6 feat: Internet Resource UI (#6434)
Fixes #6047

On mobile platforms the internet resource is rendered with all
non-favorite resources, since it was weird to see within the favorite
tab, for the system tray platforms it's rendered as part of favorites if
there is any favorite so that it's always visible to the user.

For mobile platforms the resource is non-clickeable, since the menu
shouldn't be of interest(maybe I should add it only for the sites?).

For non-mobile there is a sub menu where you can find the sites and the
enable/disable.

The current label for the resource is a place holder for the
screenshots, and can be set by the portal, if the portal doesn't set any
name it will just show "Internet Resource".

### Android screenshot


![image](https://github.com/user-attachments/assets/63deb25f-1cd1-4b49-be80-77570e612aa5)


### Linux Screenshot


![image](https://github.com/user-attachments/assets/7b67033d-71ee-4bac-98c8-4c5810bf43a3)


![image](https://github.com/user-attachments/assets/5bdbced5-bacd-4a09-a59c-aa853bb3baa0)

### Windows Screenshot


![image](https://github.com/user-attachments/assets/a3bbebb3-9a18-4b75-9e18-f58b1b61a7a3)

### MacOS screenshot

<img width="417" alt="image"
src="https://github.com/user-attachments/assets/5488d6e4-1cd2-42be-bcd7-3c51ec295590">

### iOS screenshot


![17044](https://github.com/user-attachments/assets/5321c363-5b43-4b1e-ac37-4fd7bdc68e28)
2024-08-27 04:08:19 +00:00
Jamil
2e54ae19c9 ci: Release Apple 1.2.1 (#6426)
Get the packet routing fix out.
2024-08-22 23:23:33 -07:00
Jamil
0994bd145a feat(apple): Build GITHUB_SHA into Apple clients (#6406)
Closes #6401 

<img width="1012" alt="Screenshot 2024-08-21 at 11 52 31 PM"
src="https://github.com/user-attachments/assets/3012d088-97cb-4a82-8a8f-b2a398865755">

![Screenshot 2024-08-22 at 12 05
44 AM](https://github.com/user-attachments/assets/5e1209f9-e8fa-4453-9bdd-9f40339649b4)
2024-08-22 20:49:57 +00:00
Jamil
c8eed59387 ci: Release 1.2.0 (#6395)
Releasing 1.2.0 to unblock portal deploy! Some of these have already
been published.
2024-08-22 00:18:27 +00:00
Reactor Scram
0c0cd7b514 fix(macos): menu bar (#6376)
Closes #6370 

Tested with Jamil's patch. The bug is fixed on #6370 and no apparent
regressions on iOS

---------

Signed-off-by: Reactor Scram <ReactorScram@users.noreply.github.com>
Co-authored-by: Thomas Eizinger <thomas@eizinger.io>
Co-authored-by: Jamil <jamilbk@users.noreply.github.com>
2024-08-21 22:22:37 +00:00
Gabi
dd46a489b3 fix(connlib): prevent panic on internet resource for apps (#6381)
[Refs](https://github.com/firezone/firezone/pull/6299#discussion_r1724108733)

The problem right now, after #6325 we send the internet resource up to
the clients. The clients expect a certain format for the resources and
panic if it isn't followed.

Particularly, in the case of no `address` or no `name`.

To fix this, we add a name and an address for the internet resource when
it is converted to the callback type.

Setting the `name` at that point actually makes a lot of sense since it
homogenizes the name across all platforms. But the internet resource
having an address makes no sense.

So in a next PR, when I do the last UI changes I plan to make `address`
optional for all resources on the clients and specialize the display of
the internet resource.

For now I wanted to get this in so that we don't ever panic on the
internet resource existing. (This was tested on all platforms and it
works)
2024-08-21 05:37:07 +00:00
Reactor Scram
7593dba7fb feat(client/ios): favorites menu (#6298)
![Screenshot 2024-08-14 at 16 08
14](https://github.com/user-attachments/assets/7d962b32-ee39-42d8-af4a-5f1287bb4b58)
![Screenshot 2024-08-14 at 16 36
10](https://github.com/user-attachments/assets/95876d86-1eb7-4e7f-87ca-6dbd610adddd)

---------

Signed-off-by: Reactor Scram <ReactorScram@users.noreply.github.com>
Co-authored-by: Jamil <jamilbk@users.noreply.github.com>
2024-08-20 17:57:57 +00:00
Reactor Scram
d43b501b48 fix(apple): show "Loading Resources..." instead of "No Resources" while loading (#6358)
Closes #6356

---------

Signed-off-by: Reactor Scram <ReactorScram@users.noreply.github.com>
Co-authored-by: Thomas Eizinger <thomas@eizinger.io>
2024-08-20 16:44:00 +00:00
Gabi
e00eeae790 chore(connlib): rename can_toggle to can_be_disabled (#6362)
This is made to sync this with #6299
2024-08-20 07:22:13 +00:00
Reactor Scram
7b73eeae36 feat(client/macOS): Favorite Resources menu (#6186)
```[tasklist]
- [x] Update changelog
- [x] Hook into reset button
```

---------

Signed-off-by: Reactor Scram <ReactorScram@users.noreply.github.com>
2024-08-16 20:21:48 +00:00