Commit Graph

1384 Commits

Author SHA1 Message Date
Davide ee8ef34f06
Avoid nested module navigation (#749)
A NavigationLink in VPNProviderContentModifier raised a few questions
about the navigation approach in module views. It turned out that having
a Binding to a local ObservedObject (ProfileEditor) is a recipe for
disaster.

Therefore:

- We don't need a binding to the editor module (the draft), because by
doing so we end up _observing_ the same changes from two properties, the
binding and the editor. This seems to drive SwiftUI crazy and freezes
the app once we navigate from the module to another view (e.g. in
OpenVPN the credentials or the provider server). Use the module binding
as a shortcut, but do not assign the binding to the view to avoid
unnecessary observation.
- Keep .navigationDestination() in the module view, and pass a known
destination to VPNProviderContentModifier. This will save the modifier
from creating a nested NavigationLink destination. The
VPNProviderServerView is now openly instantiated by the module view when
such destination is triggered by the NavigationLink in the modifier.
- Do not implicitly dismiss VPNProviderServerView on selection, let the
presenter take care. In order to do so, we add a .navigationPath
environment key through which the module view can modify the current
navigation stack.
2024-10-23 15:42:54 +02:00
Davide a94db35d01
Refactor a few things about provider flows (#748)
- Move disclosable menu from installed profile view to
ThemeDisclosableMenu
- Drop unnecessary configurationType modifier parameter
- Reorg view-related module extensions to separate files
- Reuse .flow fields instead of single blocks
- Show specific error on missing provider server selection
2024-10-22 15:06:13 +02:00
Davide 39bdf145e8
Resolve issues when toggling/switching profiles (#747)
- Drop logic behind connection button tasks, let the library handle
concurrency
- Drop AppContext observation of saved profiles for reconnection, let
save() actively decide
- NETunnelStrategy and NETunnelManagerRepository are now a single entity
- Avoid flickering when toggling same profile
2024-10-22 13:03:34 +02:00
Davide 696f076ac5
Add issue to FIXMEs 2024-10-20 13:00:27 +02:00
Davide 25470e61e5
Lazy-load tunnel logs in Diagnostics
Fixes #743
2024-10-20 01:54:46 +02:00
Davide ae9e200618
Omit provider in OpenVPN server configuration
Fixes #744
2024-10-20 00:22:49 +02:00
Davide 2155fe1892
Optimize updates in NEProfileRepository (#742)
Currently, NEProfileRepository decodes profiles from ALL NE managers on
any update. This is undesirable considering that:

- Profiles are only _added_ by the app
- Externally, profiles can only be _removed_

Therefore:

- Observe the initial managers to decode the initial profiles from them
- Publish values manually on save/delete (to ProfileManager eventually)
- Observe the subsequent updates for when a profile is removed
externally, i.e. its ID doesn't appear in managers

Fixes #741
2024-10-19 18:22:27 +02:00
Davide 5d2e24792c
Rewrite provider views (#740)
Resolve some flickering and state inconsistency due to overextended
observation of VPNProviderManager. Narrow down its scope to
VPNProviderServerView.

The downside of that, for now, is that servers are loaded "lazily late",
but this flow will make region selection from home easier.

Finally, show filters in popover on iPad.
2024-10-18 18:12:28 +02:00
Davide 0221aea6b6
Move some profile integrity checks to library (#739)
They really belong to Profile.Builder
2024-10-16 09:50:26 +02:00
Davide 3de75e476b
Prevent iPad dismiss when tapping outside (#737)
The user may tap outside accidentally while editing a profile, thus
losing all the edits. Avoid that.

Fixes #734
2024-10-16 08:56:58 +02:00
Davide acf066571a
Fix some key things about providers UI (#736)
Fixes #703
2024-10-16 08:53:16 +02:00
Davide 9656e5ed29
Filter servers with category/country of selected server (#735)
And use Task for blocking actions in filters.
2024-10-15 23:48:27 +02:00
Davide aeaf0a6eed
Some fixes
- Import remote profiles off the main thread
- Drop meaningless Published
- Add a FIXME to move Profile build logic to library
2024-10-15 23:37:50 +02:00
Davide 8cdd20dfb4
Fix animation in OpenVPNView 2024-10-15 21:39:47 +02:00
Davide ed28126cf7
Rework OpenVPN view with provider modifiers (#733)
Improve rendering and work around some SwiftUI bugs, e.g. with .menu
Picker on iOS (use .navigationLink instead).

Here goes the hierarchy bottom-up:

- ProviderPicker: a Picker wrapper built around ProviderManager
- ProviderContentModifier: adds a ProviderPicker on top and replaces the
content with a set of provider selectors when a provider is selected
- VPNProviderContentModifier: wrapper for ProviderContentModifier that
adds a VPN server selector
- OpenVPNView: provides a view of specific OpenVPN settings, and adds a
credentials selector to the provider/server selectors provided by
VPNProviderContentModifier
2024-10-15 21:34:02 +02:00
Davide 87c7d63678
Redo provider managers lifecycle (#732)
Update library with more efficient choices for interacting with the
providers API.

Fixes #731
2024-10-13 11:36:34 +02:00
Davide a5d4f6aee5
Unify library iOS target to 15 2024-10-12 15:51:00 +02:00
Davide 9769a151db
Provider configuration is persisted into module (#730)
When e.g. a OpenVPNModule is created without a configuration and a
provider/server is then selected, the ProfileProcessor class serializes
the profile with the provider configuration injected. When the module is
re-edited, we can see the provider server configuration in the module
after selecting "None" as provider.

Instead, validate the provider modules in ProfileProcessor, but generate the provider configuration on the fly in the tunnel.
2024-10-12 13:19:46 +02:00
Davide 8c76f33d48
Fix copy UUID in correct format 2024-10-11 19:45:58 +02:00
Davide 208198c3f8
Create OpenVPN module without a configuration (#729)
Update library to allow optional VPN configurations. This in turn allows
a module to be used with a provider, where the configuration is
generated on the fly.
2024-10-11 19:11:42 +02:00
Davide c96e7e9d6e
Define NE configuration title format in Constants 2024-10-11 17:57:31 +02:00
Davide 619ff807fd
Drop unused code in AppContext 2024-10-11 17:53:41 +02:00
Davide f2a141a189
Purge stale NetworkExtension/keychain data (#728)
- [x] NE managers were not deleted when unable to be decoded to a
profile
- [x] Keychain items were not deleted on profile removal
- [x] Perform clean-up on app launch
- [x] Perform clean-up on app active

Prematurely merged as #727 then reverted, this is the complete PR.
2024-10-11 17:48:37 +02:00
Davide 1aa393ee02
Move feature mapping to a single file (#726)
Do not scatter sensitive data.
2024-10-11 04:17:17 +02:00
Davide 8f6192c2b6
Fix extra team prefix in keychain group (#721)
Team ID already included in .xcconfig

Fixes #720
2024-10-11 03:45:20 +02:00
Davide 9449a02b77
Add meaningful prefix to keychain entries (#724)
Hard to find in keychain, add "Passepartout: " prefix to profile name.
2024-10-11 00:31:32 +02:00
Davide a0b9529870
Delete keychain entry on profile deletion 2024-10-11 00:25:26 +02:00
Davide da87ca698a
Add initial support for providers (#723)
Initial integration of providers via API:

- Generic views and modifiers for provider/server selection
- Add in OpenVPNView
- Prepare in WireGuardView

Also:

- Introduce ProfileProcessor, move IAP processing there
- Move .asModuleView() to ModuleViewModifier for proper animation
- Use .themeModal() rather than .sheet()
2024-10-11 00:24:06 +02:00
Davide 5c91eb4bf1
Review Constants
- Move container names out of Bundle
- Add API web services timeout
2024-10-10 19:29:38 +02:00
Davide De Rosa 6d6eef43c9
Rename 2024-10-10 16:24:09 +02:00
Davide d589f1162d
Reorganize shared objects (#716)
Mainly:

- Aggregate shared/mock entities in less scattered files
- Review package dependencies

Also:

- Decouple ProfileRepository from Core Data Repository in UtilsLibrary
(filters done by ProfileManager)
2024-10-10 16:20:36 +02:00
Davide 0aac8cd9f3
In-place NetworkExtension profiles (#715)
Profiles are being maintained in two places:

- Core Data
- NetworkExtension

Core Data is redundant for local profiles, so make NetworkExtension the
only source of truth.
2024-10-10 16:03:02 +02:00
Davide 6d479a7059
Render multiple translators in Credits (#701) 2024-10-09 21:42:42 +02:00
Davide df2fc54044
Render profile UUID as quartets (#700)
Easier to read.
2024-10-09 21:40:56 +02:00
Davide De Rosa 635700c195
Revisit OpenVPN view
- Move pull section below
- Add IPv6 to preview
2024-10-06 19:22:45 +02:00
Davide De Rosa 7078e5c435
Unrestrict previews 2024-10-06 19:22:44 +02:00
Davide 504bcbdbd2
Refactor and move entities around (#698)
Do some housekeeping in AppLibrary/AppUI.
2024-10-06 19:19:16 +02:00
Davide f4505d0efd
Refactor ProfileEditor to leverage ProfileType (#689)
Closes #688
2024-10-06 13:41:02 +02:00
Davide De Rosa 8b5096ab69
Make copiable text multiline by default 2024-10-05 00:17:08 +02:00
Davide De Rosa d2f44d3ee2
Fix new profiles not being saved
Broken in #685
2024-10-04 21:28:56 +02:00
Davide De Rosa 38aa83760f
Reword on-demand 2024-10-04 21:06:03 +02:00
Davide f66193cf78
Several fixes in ProfileManager (#685)
- [x] Search not accounted for when reloading profiles
- [x] Remote profile being saved twice
- [x] Add some logging
2024-10-04 20:58:11 +02:00
Davide d14f22d4a1
Use gear icon for iOS About (#684)
Resolve a discrepancy between iPhone and iPad. Leave the info icon on
macOS, where Settings are separate.
2024-10-04 18:27:09 +02:00
Davide De Rosa 671dc7f77c
Do not import remote profiles on first load 2024-10-04 15:50:45 +02:00
Davide De Rosa eea5486563
Fix crash on "Report issue" 2024-10-04 15:48:13 +02:00
Davide De Rosa 1b5e123fa6
Use .compact style in list based on size class 2024-10-04 11:39:50 +02:00
Davide De Rosa e75c264258
Go multiline rather than truncate copiable
Fixes #682
2024-10-04 10:40:18 +02:00
Davide De Rosa 71149e87d3
TODO -> FIXME 2024-10-04 10:30:14 +02:00
Davide 5fb6f4f4d2
Refactor static functions/entities in Library (#679)
Reduce the impact of hidden dependencies on BundleConfiguration and
Constants.shared

Fixes #656
2024-10-04 09:58:42 +02:00
Davide De Rosa 4b0bc7f064
Reword confirm quit 2024-10-04 02:59:03 +02:00
Davide De Rosa 00bf415056
Move modules tip to +/- 2024-10-04 02:57:09 +02:00
Davide De Rosa 7070661c3b
Group row components and make icons bigger
Fixes #678
2024-10-04 02:52:02 +02:00
Davide De Rosa fe8fa93230
Fix SwiftGen warning 2024-10-04 02:44:19 +02:00
Davide De Rosa 2d32e099b7
Rename repositories 2024-10-04 02:43:18 +02:00
Davide edb4d127e9
Delete remote profiles on local removal (#677)
Remote profiles were never deleted. Now, when removing a profile:

- The profile is deleted from the local store
- The profile is deleted from the remote store
- Other synced devices receive the update and delete the profile from
their remote store
- However, they retain a local copy of the profile
- The copy doesn't appear as "Shared on iCloud" anymore
2024-10-04 01:26:52 +02:00
Davide De Rosa 27b7e62376
Add hint about iCloud sharing 2024-10-04 00:52:25 +02:00
Davide De Rosa b660c499af
Use static 'Profile' in editor title 2024-10-04 00:47:28 +02:00
Davide De Rosa 07703fda9c
Fix some things about IP module
- Reword module description to "Routing"
- Make route modal title .inline
2024-10-04 00:44:31 +02:00
Davide De Rosa ca03d057fc
Fix iCloud icon and move to the right 2024-10-04 00:39:41 +02:00
Davide De Rosa fc834ab367
Replace Section with .themeSection
Closes #676
2024-10-03 23:32:31 +02:00
Davide 211b3b83d3
Erase iCloud store from Settings (#675)
Also, fix SwiftUI not refreshing when remote profiles are updated. There
was no objectWillChange nor Published around
ProfileManager.allRemoteProfiles, and ProfileRowView was not treating it
as ObservedObject.

Closes #673
2024-10-03 23:25:51 +02:00
Davide 372e30cf68
Import remote profiles serially (#674)
Follow the same approach as #636, because if no profiles are formerly
installed the first import will trigger a VPN permission alert. Weird
things may happen in that case if profiles are imported in parallel.
2024-10-03 22:25:59 +02:00
Davide De Rosa bf4ec4982a
Refactor phrases 2024-10-03 19:42:52 +02:00
Davide De Rosa 73665c5436
Use extended layout in profile list 2024-10-03 18:42:37 +02:00
Davide 1491766102
Per-profile iCloud syncing (#668)
Keep two separate stores to accomplish per-profile sharing:

- Local store, where to push updates manually (save/remove/search)
- Remote iCloud store, where to pull updates from

A profile can be added/removed to/from the iCloud store so that other
devices can push/pull updates to it.

Consequently, updates to the iCloud store will NEVER cause a profile
deletion. Once removed, the profile will stay locally.

Fixes #586 
Fixes #555
2024-10-03 18:41:27 +02:00
Davide De Rosa 1227df60ff
Present popover from button 2024-10-03 17:53:19 +02:00
Davide 8ad144239e
Present modules tip as popover on macOS (#672) 2024-10-03 17:50:19 +02:00
Davide De Rosa 429e79cd3a
Refactor theme section and some phrases 2024-10-03 17:35:57 +02:00
Davide 0917e47ea3
Granularize app features (#671)
Split .networkSettings and add .sharing for #668
2024-10-03 12:13:03 +02:00
Davide 63b0199a39
Merge Settings into About on iOS (#670)
Closes #669
2024-10-03 11:25:39 +02:00
Davide e8d5f2477b
Prepare interactive login for paywall (#663)
See #662
2024-10-02 16:05:40 +02:00
Davide 3ab80cd076
Fix incorrect VPN status in some cases (#661)
Regression following #636
2024-10-02 13:40:44 +02:00
Davide 3fbf803518
Ignore unmappable Core Data entities (#660)
But implement .discard for testing.
2024-10-02 13:35:49 +02:00
Davide De Rosa f602655568
Link TODOs to issues 2024-10-01 15:50:12 +02:00
Davide De Rosa bef1d36aa4
Fix annoying singleton warning 2024-10-01 15:45:53 +02:00
Davide 51dbc3f246
Add App Intents extension stub (#655)
Just the Xcode metadata, no actual content.
2024-10-01 10:17:20 +02:00
Davide De Rosa 087f177bd7
Omit storage section in release 2024-10-01 09:57:45 +02:00
Davide De Rosa 2191d2c946
Update library 2024-10-01 08:04:42 +02:00
Davide De Rosa 635708695e
Retain last used profile beyond disconnection
Fixes #650
Fixes #651
2024-10-01 00:08:36 +02:00
Davide De Rosa 51cb1d2d38
Fix library about previous commit 2024-09-30 21:08:45 +02:00
Davide 4b1f6e547b
Fix some on-demand behavior (#646)
Fixes #644 
Fixes #645
2024-09-30 19:35:41 +02:00
Davide De Rosa 3f60dee9a2
Add missing Info.plist document key 2024-09-30 19:00:09 +02:00
Davide De Rosa cf3fe7449e
Fix missing CFBundleTypeName 2024-09-30 18:08:29 +02:00
Davide 0e4dd086ef
Import profiles with on-demand disabled (#641)
Make it friendly to Shortcuts automation by default.
2024-09-30 17:40:24 +02:00
Davide aead866275
Open app with multiple files (#640)
onOpenURL cannot handle multiple URLs on macOS, whereas
NSApplicationDelegate can.

Fixes #637
2024-09-30 17:22:16 +02:00
Davide 4877c2bd20
Restrict paywall to on-demand rules (#639)
Rather than whole module.

Closes #638
2024-09-30 15:56:32 +02:00
Davide a9fa6a2f62
Maintain one configuration per profile (#636)
Helps with automation. Install the VPN configuration before persisting a
profile, so that the 1:1 reference with OS settings is maintained.
Likewise, uninstall the VPN configuration after removing a profile.

This before-save hook also resolves a problem with multiple imports,
where multiple VPN permission alerts coalesce if no VPN configuration is
installed. Now the first import waits for the permission synchronously.

Fixes #618
2024-09-30 14:56:20 +02:00
Davide a29495a69c
Decouple Constants from BundleConfiguration (#635)
Fixes #619
2024-09-28 19:05:47 +02:00
Davide 28a2017da2
Confirm quit on macOS (#634)
To do so, must prevent window from closing.

Fixes #223
2024-09-28 17:58:48 +02:00
Davide 5deb8ec763
Prepare for macOS settings (#629) 2024-09-28 12:47:33 +02:00
Davide De Rosa c0234b07a8
Fix missing Window on iOS
Broken by 9e6e59276b
2024-09-28 11:56:35 +02:00
Davide 9e6e59276b
Associate and handle imported files (#628) 2024-09-28 11:43:57 +02:00
Davide 95c09f4353
Prefix group ID with team ID on macOS (#626)
Fixes #624
2024-09-28 11:13:32 +02:00
Davide 989886c434
Fix description of parsing errors on import (#623)
Fixes #607
2024-09-28 00:01:01 +02:00
Davide fbc6ece59d
Reorganize library into AppUI (#621)
Closes #611
2024-09-26 23:13:55 +02:00
Davide 4124ff5cae
Lock app with FaceID (#609)
Restore feature as-is from v2.

Closes #606
2024-09-25 19:32:07 +02:00
Davide 752dc6229f
Associate with ovpn/conf/zip files (#605)
Closes #604
2024-09-25 18:14:26 +02:00
Davide a665670cf7
Add job for public beta deployment (#600)
Closes #599
2024-09-24 11:17:52 +02:00
Davide 6cc86e8668
Import v3 code (#597)
Closes #565
2024-09-23 15:02:26 +02:00
Davide De Rosa 6bfda3487b
Attempt release 2024-09-22 16:29:08 +02:00
Davide De Rosa ea4028d33c
Attempt release 2024-09-22 16:20:20 +02:00
Davide De Rosa d1d66dcbb3
Attempt release 2024-09-22 16:16:26 +02:00
Davide De Rosa a98cedfd7d
Attempt release 2024-09-22 16:02:40 +02:00
Davide De Rosa 1a6c5fd303
Attempt release 2024-09-22 15:58:52 +02:00
Davide De Rosa 10cfc8e54a
Attempt release 2024-09-22 15:55:50 +02:00
Davide De Rosa 9e2b757ec5
Attempt release 2024-09-22 15:43:34 +02:00
Davide De Rosa 5587b9902a
Allow deletion of TV profiles
Fixes #480
2024-09-22 15:41:53 +02:00
Davide De Rosa 18b933d36e
Respect global macOS accent (#490) 2024-02-03 11:52:29 +01:00
Davide De Rosa 7f5b84c72b
Override profile list selection color (#486)
Both List and Toggle use accent color for their tint. Instead:

- Set grayish .tint on List to customize selection color
- Retain global accent in VPNToggle

Fixes #458
2024-01-27 15:59:40 +01:00
Davide De Rosa 7b30d48ea4
Bump version 2024-01-20 00:21:14 +01:00
Davide De Rosa 24b08c4b50
Update restricted profile except expiration (#481)
TV profiles were not updated until expiration.
2024-01-19 08:39:38 +01:00
Davide De Rosa e3f4443cc0
Attempt release 2024-01-19 00:07:12 +01:00
Davide De Rosa 5fe9d7405f
Attempt release 2024-01-14 15:14:42 +01:00
Davide De Rosa 64d1131fdd
Update copyright
Closes #473
2024-01-14 14:36:55 +01:00
Davide De Rosa cdd33c881d
Attempt release 2024-01-14 14:04:39 +01:00
Davide De Rosa 0299466a8f
Unintended sensitive data in issue reports (#471) 2024-01-14 14:01:54 +01:00
Davide De Rosa ea0fd51362
Attempt release 2024-01-11 18:18:23 +01:00
Davide De Rosa 4b909ebf8a
Attempt release 2024-01-11 17:52:31 +01:00
Davide De Rosa 3fb521a584
Split Apple TV purchase (#467)
Full version features were listed when purchasing the Apple TV feature,
and this was very misleading.
2024-01-11 17:52:05 +01:00
Davide De Rosa 917e712510
Attempt release 2024-01-11 16:47:40 +01:00
Davide De Rosa e21e11b022
Rework how purchasable products are presented (#465)
Fixes #464
2024-01-11 16:46:52 +01:00
Davide De Rosa 63cbf39a8a
Attempt release 2024-01-11 00:16:47 +01:00
Davide De Rosa 328e2bafd6
Attempt release 2024-01-11 00:15:49 +01:00
Davide De Rosa 92d5008d1c
Drop trailing dot in some strings 2024-01-10 20:14:20 +01:00
Davide De Rosa e8d8f27750
Attempt release 2024-01-10 18:51:03 +01:00
Davide De Rosa 2e989fd127
Rewrite wrong refund logic (#462)
So, if both a purchase and a refund of feature `.foobar` existed,
whatever the dates, the purchase was incorrectly discarded.

Fixes #459, fixes #461
2024-01-10 18:48:38 +01:00
Davide De Rosa 821d4c79f4
Attempt release 2024-01-09 18:18:53 +01:00
Davide De Rosa bf4dc6c920
Add tvOS build to beta/review CI jobs (#453)
_Should_ work out of the box.

Closes #450
2024-01-07 12:17:46 +01:00
Davide De Rosa dde2d22eed
Revisit submission of OpenVPN diagnostic report (#452)
Some improvements:

- Suggest replacing the template with the description of the issue
- Attach app log
- Append purchased features

Also reuse the same body for `mailto:` reports, as metadata were not
being attached in that case.

Closes #377
2024-01-07 12:11:16 +01:00
Davide De Rosa 60ed10e45e
Attempt release 2024-01-06 00:10:22 +01:00
Davide De Rosa 87804e89d8
Attempt release 2024-01-06 00:07:26 +01:00
Davide De Rosa 978c74ad6e
Attempt release 2024-01-05 23:55:19 +01:00
Davide De Rosa 4836bbac18
Restore proper OpenVPN connectivity (#447) 2024-01-05 23:54:16 +01:00
Dmytro Chyrkin 0b7b82129b
fix: added missing uk translation (#445)
Co-authored-by: Davide De Rosa <keeshux@gmail.com>
2024-01-05 16:38:16 +01:00
Davide De Rosa 7295249cb8
Attempt release 2023-12-31 01:24:28 +01:00
Davide De Rosa 5c5697762b
Add minimal TV app
Closes #315
2023-12-31 01:21:38 +01:00
Davide De Rosa 47c6b02c4d
Use FeatureModel in paywall (#442)
Rather than anonymous tuples.
2023-12-23 12:38:00 +01:00
Davide De Rosa 7d7aaa8b0c
Update paywall (#441)
Group features and drop platform purchases.
2023-12-23 12:10:34 +01:00
Davide De Rosa 239d3e6853
Fix in-app eligibility in VPN (#440) 2023-12-23 07:59:23 +01:00
Davide De Rosa 4c4876c5f7
Incorrect handling of receipt purchases (#439) 2023-12-21 08:54:00 +01:00
Davide De Rosa 1551b59f21
Use async in ProductManager (#438)
Drop legacy completion handlers. Push `Task` to the views.

Also:

- Group library tests in a test plan
- Fix a broken library dependency
2023-12-21 08:09:52 +01:00
Davide De Rosa a0da930d98
Refactor and test ProductManager (#437)
Carefully drop the StoreKit and Kvitto dependencies for ProductManager
to be testable.

Rebuild test target completely to start writing meaningful tests in
general.
2023-12-20 20:43:39 +01:00
Davide De Rosa 2d57c4ad8a
Sendable warning in credits view (#433)
Extension of a View apparently does not run on MainActor.
2023-12-17 07:47:45 +01:00
Davide De Rosa 5cfa32dbb7
Add data count to WireGuard connections (#430)
Closes #312
2023-12-14 22:18:20 +01:00
Davide De Rosa 4a92acbeb9 Attempt release 2023-10-14 19:50:24 +02:00
Davide De Rosa 7ceec3f322 Bump event count for review 2023-10-14 19:48:52 +02:00
Davide De Rosa cc6c8a90d7 Bump version
Drop stale version in project.
2023-10-14 16:06:17 +02:00
Davide De Rosa 2596622a43 Attempt release 2023-10-10 23:01:19 +02:00
Davide De Rosa 12c08c132c
Update metadata and translations (#365) 2023-10-10 23:00:19 +02:00
Davide De Rosa 7de000148f
Level up to strict Concurrency (#361)
Trigger and resolve some additional Concurrency issues.
2023-09-10 20:36:52 +02:00
Davide De Rosa c5cf0ca1d2
Shift async responsibility to ProductManager (#360)
SandboxChecker should not care about what actor is running on.

Better than #356
2023-09-10 19:08:31 +02:00
Davide De Rosa 27266a6d47 Fix stupid compile error 2023-09-10 18:40:24 +02:00
Davide De Rosa d02da0bad8
Fill missing descriptions for some errors (#359)
Fixes #358
2023-09-10 17:15:40 +02:00
Davide De Rosa 9d72dc43a2 Attempt release 2023-09-10 11:21:59 +02:00
Davide De Rosa f32c6f8fde
Retain persistence objects in manager (#357)
Relying on Core Data for context retention is fragile, better to keep a
reference of the *Persistence objects ourselves.

Also, remove any CloudKit reference from CoreContext.
2023-09-10 11:20:56 +02:00
Davide De Rosa 0b755c1c77 Attempt release 2023-09-10 10:35:22 +02:00
Davide De Rosa 0872c27fce
Move CloudKit logic to PersistenceManager (#355)
Observe updates rather than execute operations imperatively. Also refine
responsibilities of AppContext and CoreContext.
2023-09-10 10:34:42 +02:00
Davide De Rosa c645f39254
Fix SandboxChecker actor (#356)
Mac function was still running on main actor. Only constrain to main
actor on public API.
2023-09-10 10:27:11 +02:00
Davide De Rosa 3891723356 Attempt release 2023-09-10 08:09:05 +02:00
Davide De Rosa 6b0a08a189 Attempt release
Fix sed syntax on Mac.
2023-09-10 01:08:07 +02:00
Davide De Rosa a38e3fed7a
Look up TestFlight flag asynchronously (#352)
Xcode has been quite obnoxious recently with this issue. Start the app
with the most restrictive type (.undefined), relax restrictions after
looking up sandbox and app receipt.
2023-09-10 00:52:39 +02:00
Davide De Rosa 33d9e05907
Drop < 2.2.0 key after migration (#353)
Otherwise, iCloud is being constantly reinforced to true.
2023-09-10 00:50:12 +02:00
Davide De Rosa 791b6be7d5
Allow erasing remote iCloud store (#351)
Convenient for those with privacy concerns.
2023-09-09 21:52:32 +02:00
Davide De Rosa a4ca8cc996
Support iCloud sync as an option (#350)
Sync will be enabled on upgrade for consistency with current behavior,
and disabled for new installs.

Fixes #227
2023-09-09 20:29:04 +02:00
Davide De Rosa 2d046181b0
Only migrate if current version is higher (#349) 2023-09-08 22:45:04 +02:00
Davide De Rosa a3cfde1950
Drop v2 migrations (#348) 2023-09-08 22:18:41 +02:00
Davide De Rosa 0f84859354
Do some housekeeping (#347)
- Be consistent with on-demand rules
- Use shortcut reduce(into:)
2023-09-08 16:20:42 +02:00
Davide De Rosa c80d17ceb4
Fix .locksInBackground AppStorage key (#346) 2023-09-08 16:20:24 +02:00
Davide De Rosa b4b2db176c
Fix .sink retain cycles (#345) 2023-09-08 16:20:01 +02:00
Davide De Rosa f159252e24
Replicate Diagnostics in Settings (#342)
As the only link to "Diagnostics" appears in the profile screen, when
there are no profiles the screen is unreachable. Replicate the same
entry in Settings.
2023-08-06 20:27:16 +02:00
Davide De Rosa 04e090e26f
Suppress SceneConfiguration warning (#341) 2023-08-06 09:43:24 +02:00
Davide De Rosa 7a74525149 Fix b608d59d8f 2023-07-31 08:25:30 +02:00
Davide De Rosa 19e52bfd59 Attempt release 2023-07-30 18:01:44 +02:00
Davide De Rosa b608d59d8f
Omit footer when on-demand is disabled (#339)
Preserve footer in that case, just empty. Adding/removing footer seems
to result in a worse animation.
2023-07-30 17:59:29 +02:00
Davide De Rosa 388af4a73c Attempt release 2023-07-30 17:47:41 +02:00
Davide De Rosa db4c6094ea Attempt release 2023-07-24 23:32:51 +02:00
Davide De Rosa bae843363c
Fall back sandbox receipt to release receipt (#337)
Could be a way to enable paid features in TestFlight builds for those
who originally bought them from the App Store.
2023-07-24 23:32:05 +02:00
Davide De Rosa 65d6e30469
Consider text length in endpoint rows (#336) 2023-07-23 15:17:28 +02:00
Davide De Rosa 38cca79683 Attempt release 2023-07-23 13:59:56 +02:00
Davide De Rosa 34f6738b69
Focus some text fields on appearance (#334)
Feature from iOS 15, use it on:

- New profile name
- New profile passphrase
- Renamed profile name
- Account username
2023-07-23 13:28:47 +02:00
Davide De Rosa 6ede6f052a
Allow editing of OpenVPN endpoints (#335)
Hosts only:

- Add new
- Edit/delete existing
- Reorder

Closes #206
2023-07-23 12:45:47 +02:00
Davide De Rosa e0dbca224f
Rework "Trusted networks" to be a generic "On-demand" (#333)
Extend the feature by also providing a complementary "include" policy,
i.e. activate the VPN _only_ on the specified networks. "Trusted
networks" was only providing the "exclude" counterpart, i.e. _except_
the specified networks.

Closes #119
2023-07-23 08:44:46 +02:00
Davide De Rosa 1c3cbe02e5
Improve OpenVPN Endpoint UX (#332)
- Make selection linear by address
- Do not hide endpoints when automatic, show disabled
- Suggest manual endpoint required
- Pre-expand selected endpoint address
- Do not dismiss on selection, because selected value is not visible in
ProfileView
2023-07-22 17:10:16 +02:00
Davide De Rosa 0734816c05 Bump version 2023-07-17 21:48:25 +02:00
Davide De Rosa 2357324a74
Update some metadata (#331)
A bit of everything.

- Use GitHub handles in CHANGELOG
- Mention XOR patch in README and keywords
- Update gems
- Add GitHub issue template
- Fix missing script in release workflow
2023-07-17 21:46:32 +02:00
Davide De Rosa 4173c7aa6c
Externalize complex bindings (#329)
Some bindings are too convoluted, move them out of initializers.
2023-07-17 21:44:18 +02:00
Davide De Rosa 0804c6b38e Attempt release 2023-07-06 18:47:35 +01:00
Davide De Rosa a7ea010d4e
Extend error handler to modals (#327) 2023-07-06 19:29:10 +02:00
Davide De Rosa 1935d9e92c Attempt release 2023-07-06 11:10:10 +01:00
Davide De Rosa cf43e1cd7b Attempt release 2023-07-06 11:05:27 +01:00
Davide De Rosa b5d230f0b9 Attempt release
Use TunnelKit 6.1.0
2023-07-05 17:16:09 +01:00
Davide De Rosa f0e3b2fa9c
Improve release workflow (#326) 2023-07-05 18:07:47 +02:00
Davide De Rosa 98e5e4cdde
Share common protocols across localized strings (#324) 2023-07-05 17:18:33 +02:00
Davide De Rosa bf70c7c59a
Reorganize app folders (#323) 2023-07-04 22:29:43 +02:00
Davide De Rosa bd6340ce77
Split reusable views into extensions (#322)
Like in #321
2023-07-03 17:37:16 +02:00
Davide De Rosa d7ebcb23ba
Split views into extensions (#321)
Nothing but moving code around to reorganize views into the following
sections (MARK):

- Properties/Body
- Subviews
- Actions
2023-07-03 16:54:43 +02:00
Davide De Rosa 7198150f00
Refactor alerts to use latest API (#320) 2023-07-03 16:41:49 +02:00
Davide De Rosa 278efaf347
Refactor domain errors (#310) 2023-07-02 12:51:50 +02:00
Davide De Rosa 3a06d6c984 Do not use spaces in filenames 2023-06-18 10:05:10 +02:00
Davide De Rosa 7030ad40c2 Do not observe shared entities if uninterested (#313)
`@ObservedObject` is unnecessary in cases where manager operation is
unidirectional.
2023-06-18 10:05:10 +02:00
Davide De Rosa ddab76326d
Replace deprecated .windows with .connectedScenes (#316) 2023-06-17 21:40:09 +02:00
Davide De Rosa fb47def4ed
Avoid inline format for non-descriptive strings (#302) 2023-05-28 11:57:35 +02:00
Davide De Rosa b89328b5c3
Only show 'Reconnect' on active profile (#311)
It doesn't make sense anywhere else.
2023-05-28 11:23:07 +02:00
Davide De Rosa 36cad41529
Fix IPv4/6 address validation (#308) 2023-05-27 21:34:31 +02:00
Davide De Rosa d05cf7140c
Fail gracefully when refreshing infrastructure (#307) 2023-05-27 13:52:57 +02:00
Davide De Rosa a78a7b18b5
Encapsulate *Persistence responsibilities (#305)
Do not leave the choice of a repository context up to the library
consumer. Instead, provide a specific factory (*Persistence) for each
module.
2023-05-27 12:32:53 +02:00
Davide De Rosa 7ccb10febc
Rethink library architecture (#301) 2023-05-24 18:19:47 +02:00
Davide De Rosa b4ad8dea0d Do some code clean up
- Use guard in validators

- Rename URL.openURL() to URL.open()

- Sort imports (SwiftLint)

- Drop unused VPNProtocolType.allTypes

- Drop unused imports
2023-05-21 11:48:03 +02:00
Davide De Rosa 1051a8dc52
Revisit domain name validators (#297)
- Allow TLDs longer than 6 characters

- Allow wildcards in proxy bypass domains
2023-05-01 11:44:41 +02:00
Davide De Rosa 40330cc87a Attempt beta release 2023-04-18 18:15:39 +02:00
Davide De Rosa 1fd38790e4 Attempt beta release 2023-04-18 17:24:47 +02:00
Dmytro Chyrkin 1cb5821f9d
Small fixes for Ukrainian translation (#288) 2023-04-12 09:05:39 +02:00
Davide De Rosa 574f9a05b5
Show app version in Mac menu (#286) 2023-04-08 11:57:42 +02:00
Davide De Rosa 50b4806275
Remove nonsense Mac menus (#285) 2023-04-08 11:56:17 +02:00
Davide De Rosa 7a7a815979 Attempt beta release 2023-04-06 12:51:01 +02:00
Davide De Rosa aec7f8eefe Attempt beta release 2023-04-05 16:32:50 +02:00
Davide De Rosa e3cfdadf97
Cover screen on .inactive (#282)
* Make unlock block actor-safe

* Cover views on .inactive, lock on .background
2023-04-05 16:31:17 +02:00
Davide De Rosa 0591363b15 Refine platform-specific release notes
Symlink metadata to iOS, except "What's New".
2023-04-05 07:59:50 +02:00
Davide De Rosa 34e41ba93f Attempt beta release 2023-04-04 18:59:44 +02:00
Davide De Rosa 07bd126131
Recognize IAPs other than full version on Mac (#281) 2023-04-04 18:59:05 +02:00
Davide De Rosa d4d3d97081 Attempt beta release 2023-04-04 17:11:44 +02:00
Davide De Rosa ad90a5908b Fix truncation in provider footer 2023-04-04 17:10:54 +02:00
Davide De Rosa 7e2e4d6caa
Import missing translations (#280) 2023-04-04 17:07:41 +02:00
Davide De Rosa e050c0c8df
Catch WireGuard parsing errors properly (#279)
They could be reported as OpenVPN errors.
2023-04-03 08:48:18 +02:00
Davide De Rosa 7f9ae7c3bc
Always show "Reconnect" button (#278)
Will do nothing if VPN is disabled. Suboptimal, but consistent
with Mac menu.
2023-04-01 22:46:12 +02:00
Davide De Rosa 33e0ceec04
Lock in background (#275)
There are plenty of situations where the app kind of stays in the
foreground, but goes to .inactive state. Lock screen could be
annoying in those cases.
2023-03-31 23:47:29 +02:00
Davide De Rosa e9f11d1dbe Attempt beta release 2023-03-25 17:07:58 +01:00
Davide De Rosa 1e0d522010
Drop #available condition on iOS 15 (#274) 2023-03-25 17:05:53 +01:00
Davide De Rosa 6af4bb7e0f
Resolve issues with lock screen (#273)
* Make lock screen a View extension

- Reuse in global theme (apply to all modals)

- Use a ZStack rather than replace (retain content/navigation)

- Share lock state across all LockableView
2023-03-25 16:47:08 +01:00
Davide De Rosa 76084dbd30 Attempt beta release 2023-03-20 15:07:26 +01:00
Davide De Rosa 4eb2ac5e0e
Revert interactive login (#272)
Implementation is buggy/incomplete.

See #259
2023-03-20 15:06:56 +01:00
Davide De Rosa 2d00a05c4c Attempt beta release 2023-03-20 14:14:20 +01:00
Davide De Rosa 5f991d9cc2
Unlock app with biometrics (#271)
* Prevent app lock completely in macOS

* Add missing Face ID metadata for biometrics auth

* Ensure MainActor

* Reword option

* Fix lock logic on launch
2023-03-20 14:12:42 +01:00
Davide De Rosa 325e10845d
Option to lock app when entering background (#270) 2023-03-20 11:00:01 +01:00
Davide De Rosa 7346bfc65c
Add 3D Touch items (#267)
- Enable/Disable VPN

- Reconnect (if enabled)

Move lifecycle operations to SceneDelegate.
2023-03-19 20:04:31 +01:00
Davide De Rosa 4a2dec9c6a Attempt beta release 2023-03-19 16:11:09 +01:00
Davide De Rosa 513b38584d
Upgrade SwiftLint to CI version (#266) 2023-03-19 16:10:40 +01:00
Davide De Rosa 4faeb85295 Attempt beta release
Update bundle in beta script.
2023-03-19 14:42:56 +01:00
Davide De Rosa fbd32d8b26
Fine-tune SwiftLint (#265) 2023-03-19 14:41:53 +01:00
Davide De Rosa 1dda8dce98 Attempt beta release 2023-03-19 08:45:34 +01:00
Davide De Rosa 17ae9793df
Randomize provider server (#263)
* Pick random server within location

* Add toggle to provider section in profile
2023-03-19 08:19:32 +01:00
Davide De Rosa c85f3d894e
Restore DNS "Domain" setting (#260) 2023-03-17 22:16:04 +01:00
Davide De Rosa f06f097f27
Add SwiftLint phase (#262) 2023-03-17 21:55:47 +01:00
Davide De Rosa cecf64d871
Move Diagnostics view to Profile bottom (#261) 2023-03-17 21:46:53 +01:00
Davide De Rosa 26c34638cb Make category optional in server long description 2023-03-17 18:09:21 +01:00
Davide De Rosa 8f999a462e Do not open long content when XOR is disabled 2023-03-17 17:52:57 +01:00
Davide De Rosa 37354d1b87 Update copyright 2023-03-17 16:56:19 +01:00
Davide De Rosa 2e10aab039
Extend authentication methods (#259)
* Add profile authentication method

- Persistent (default, fallback)

- Interactive (may expire through reconnections)

- TOTP (seed-based) - currently disabled

* Disable on-demand if login is interactive

* Present interactive prompt on VPN toggle
2023-03-17 16:49:35 +01:00
Davide De Rosa 44ccd21536
Fetch full profiles from Core Data (#258)
* Fetch full profiles

* Manage full profiles in organizer
2023-03-16 16:49:09 +01:00
Davide De Rosa 17b01a4dbc Clean up some code
- Drop stale generic

- Improve readability
2023-03-16 15:12:23 +01:00