Commit Graph

2184 Commits

Author SHA1 Message Date
Davide De Rosa 0f790a9401 Fix leaks when reconnecting from menu
LightVPNManager implementation was still disabling/enabling VPN
manually instead of using reconnect() atomically, which led to an
IP leak in between the two steps.
2022-08-13 16:48:00 +02:00
Davide De Rosa 7a700408a8 Improve a few things about provider profile menus
- Add "Connect" item to connect to current server

- Sort provider categories ("Default" should also come first)

Reuse bundle from constants.
2022-08-13 16:47:01 +02:00
Davide De Rosa 80f71507e3 Do not navigate to active profile on launch 2022-08-05 12:50:12 +02:00
Davide De Rosa 984b460b59 Update bundle 2022-08-05 07:57:35 +02:00
Davide De Rosa 92ffc382cb Reconnect VPN without disabling it
Retain on-demand flag to avoid leaks during reconnection.
2022-08-05 07:40:43 +02:00
Davide De Rosa 1c64253a1f Fix inverted profile lastUpdate logic
- Least recent was set last in the headers dictionary, thus
overwriting most recent (ascending = false)

- Mapping full profiles directly to array was generating
duplicates, use a dictionary to keep ID unicity
2022-08-04 23:36:09 +02:00
Davide De Rosa 0464cd0476 Fix property in launch on login bindings 2022-08-04 23:35:42 +02:00
Davide De Rosa b183dece8c Fix logic to activate first created profile
Broken in dec7fb9030

VPN was lost when app was sent to background. Current (and active)
profile was persisted with nil isActive and instead of ignoring
profile activation, isActive was falling back to
allHeaders.isEmpty (false), erroneously deactivating the profile
and disconnecting the VPN.
2022-08-04 23:33:17 +02:00
Davide De Rosa 9195d426e4 Attempt beta release 2022-07-18 08:03:24 +02:00
Davide De Rosa f8c6b6580d Encapsulate launchesOnLogin AppPreference from Mac 2022-07-18 08:03:24 +02:00
Davide De Rosa b26e334881 Get Mac strings from main bundle
Alter bundle in SwiftGen configuration file.
2022-07-18 07:55:56 +02:00
Davide De Rosa 04faf57d4c Send app to background if started hidden
Sandbox had to be enabled in order to submit binary to App Store
Connect, therefore command line arguments cannot be used to tell
if the app was started by the launcher.

However, given that launcher starts app in hidden state, we can
safely assert that if the app is hidden on start, it was started
by the launcher.

See f33380b4e2

Also drop automatic signing on Mac bundle and unused utils.
2022-07-18 07:55:56 +02:00
Davide De Rosa 32e548421f Attempt beta release 2022-07-17 14:50:05 +02:00
Davide De Rosa c581042b10 Enable macOS public beta workflow 2022-07-17 14:48:14 +02:00
Davide De Rosa 2c5f3d0bf0 Send app to background in OrganizerView handler
Keep handler in a single place.
2022-07-17 14:47:15 +02:00
Davide De Rosa 781291940f Enforce window appearance on 'Show' after closure 2022-07-16 21:24:53 +02:00
Davide De Rosa 9458c4f3a3 Fix server description and sorting
- Name (countries, area)
- Index
- Tags

Also use short description in menu (without country prefix).
2022-07-16 17:39:42 +02:00
Davide De Rosa ce280c0826 Fix old entity naming 2022-07-16 17:39:42 +02:00
Davide De Rosa 48d8173871 Drop return in single line functions 2022-07-16 17:39:42 +02:00
Davide De Rosa 8d5f147194 Add SurfShark to README 2022-07-16 17:39:42 +02:00
Davide De Rosa dec7fb9030 Activate first created profile 2022-07-16 17:39:42 +02:00
Davide De Rosa 58e375ec41 Attach @MainActor where needed
Some methods were updating UI from non-main thread.
2022-07-16 17:39:42 +02:00
Davide De Rosa f33380b4e2 Launch application in background from launcher
Requires disabling sandbox for launcher to receive arguments.

https://developer.apple.com/documentation/appkit/nsworkspace/openconfiguration/3172708-arguments

Refine some minor things about launcher:

- Pass invoker to NSApp.terminate() calls

- Use legacy version of .openApplication() to drop Concurrency
2022-07-16 17:39:42 +02:00
Davide De Rosa 3f4b55a003 Implement Mac bundle with system menu
Use bundle as a means to provide Mac APIs to Catalyst app.

In order to cross the @objc wall set by the Mac Bundle mechanism,
Swift structures cannot be used directly and must be bridged
through ObjC facades.

Create NSMenu in MVVM style and install it on app launch. Make
sure to do it in AppDelegate.applicationDidFinishLaunching(),
because doing it as early as in PassepartoutApp.init() would
crash Mac code.

Use .representedObject to own view models.

With menu in place, app can be sent to background when main window
is closed. Requires multiple documents support for app not to die
instantly.
2022-07-16 17:39:42 +02:00
Davide De Rosa 7d5f3e63c8 Add 'didUpdate' subjects in managers
objectWillChange may not work outside SwiftUI.

- ProfileManager.didUpdateProfiles

- ProviderManager.didUpdateProviders
2022-07-15 08:59:29 +02:00
Davide De Rosa 7771b50b56 Add ProfileManager methods to return full profiles 2022-07-14 17:07:30 +02:00
Davide De Rosa 9d9dc2b2f6 Rename activeProfileId publisher for consistency 2022-07-14 17:07:30 +02:00
Davide De Rosa cbf00cef73 Fix Core Data fault due to missing headers lastUpdate 2022-07-14 17:07:30 +02:00
Davide De Rosa 0a2d1e9d37 Mitigate fatalError() in properties, fail gracefully
Do not trigger fatalError() on properties too much because
SwiftUI may read them at any unpredictable time.
2022-07-08 20:01:53 +02:00
Davide De Rosa a442603696 Polish bundleConfig with strong type checking 2022-07-05 08:11:31 +02:00
Davide De Rosa 3e8a49c970 Remove store value when set value is nil
Fixes crash on removing active profile when current, due to setting
nil activeProfileId in UserDefaults.
2022-07-05 08:04:58 +02:00
Davide De Rosa ebe8ae3d29 Retain profiles order, no active on top 2022-07-04 00:32:06 +02:00
Davide De Rosa e8f65e9db0 Also show active profile as "Disabled" 2022-07-04 00:31:54 +02:00
Davide De Rosa 15dec59692 Comment on app path inferral from launcher 2022-06-26 08:53:10 +02:00
Davide De Rosa 0ff831f021 Fix target in test workflow 2022-06-25 20:27:24 +02:00
Davide De Rosa 1543eef3c1 Add convenient appId constant 2022-06-25 20:27:24 +02:00
Davide De Rosa b966826f19 Use main container path as launcher argument
Rather than "Contents/MacOS/Passepartout", raising a permission
error.

Also add .hides to prevent window from showing on launch.
2022-06-25 20:16:06 +02:00
Davide De Rosa df0d40c556 Add launcher target
- Launch main app in background then die

- Do not launch app if already running

- Launch app binary relative to launcher location
2022-06-25 16:53:38 +02:00
Davide De Rosa 3cc82cc807 Fix case in Info keys related to launch screen 2022-06-25 16:53:38 +02:00
Davide De Rosa 7ba9879c8c Revisit constants structure
Move some stuff back to App:

- Constants, and split library-dependent

- InApp entities and constants

Flatten global constants hierarchy.
2022-06-25 14:36:28 +02:00
Davide De Rosa 3c9511cd0c Only support Catalyst where required
- App
- Tunnels
2022-06-25 13:28:28 +02:00
Davide De Rosa 9a8477225e Refactor library into domain + impl 2022-06-23 23:31:01 +02:00
Davide De Rosa 8504998bbb Reorganize app-specific shared code into AppShared 2022-06-19 14:41:26 +02:00
Davide De Rosa 85129f17af Prefix store keys with "Passepartout." domain
Also remove stale preferences from early betas after migrating
relevant ones.

Extend KeyValueStore with removeValue() for this purpose.
2022-06-19 13:33:49 +02:00
Davide De Rosa 02a9db057f Update TunnelKit
- Set explicit tunnel log path

- OpenSSL 1.1.1o
2022-06-19 13:33:49 +02:00
Davide De Rosa bb1a35acea Set full log path relative to App Group container
Also rename from Debug.log to App.log
2022-06-19 13:33:49 +02:00
Davide De Rosa 10b4c321c8 Separate context responsibilities
- Split Core and App context

- Move .shared instantiation to extension

Context may differ by target.
2022-06-16 13:42:53 +02:00
Davide De Rosa 14b42fbea5 Persist managers state to generic key-value store
Move all persisted state out of AppManager to where it really
belongs. To do that, inject a shared KeyValueStore object into
managers that need to persist part of their state in a strongly
typed manner.

Below are persisted states:

- PersistenceManager
    - persistenceAuthor

- ProfileManager
    - activeProfileId

- UpgradeManager (formerly AppManager)
    - didMigrateToV2 (migrate former value)

- VPNManager
    - tunnelLogFormat
    - masksPrivateData

A similar approach is used for app-specific preferences, by using
a strongly typed enum (AppPreference) together with SwiftUI
@AppStorage property wrapper.

Worth moving logging logic into a specific LogManager.

Finally, drop any former view dependency on AppManager, as states
are now accessed through specific managers.
2022-06-16 13:42:37 +02:00
Davide De Rosa 127ba28a8c Run SwiftGen manually
Build phase may raise concerns in CI.
2022-06-16 13:42:21 +02:00
Davide De Rosa 77ff910adc Update and extend copyright notices 2022-06-16 13:42:21 +02:00