Commit Graph

1387 Commits

Author SHA1 Message Date
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
Davide De Rosa 1b704d7d4a
Decouple VPNManager from TunnelKit (#248)
* Drop VPNManager dependency on TunnelKit

* Hook .masksPrivateData to preferences updates
2022-11-10 07:42:08 +01:00
Davide De Rosa 7ed27558fc
Move refund detection inside ProductManager (#246)
* Detect refunds inside ProductManager

Compare former value and report refund event via subject.

* Hook VPN uninstallation on refund event
2022-11-06 18:51:13 +01:00
Davide De Rosa ba09dcffa7
Full OpenVPN XOR patch (#245) 2022-11-06 18:08:41 +01:00
Davide De Rosa c48e35887c Bump version 2022-11-02 22:33:26 +01:00
Dmitry Chirkin 07eaa54f1b
Ukrainian transaltion (#243)
Co-authored-by: Davide De Rosa <keeshux@gmail.com>
2022-11-01 14:20:09 +01:00
Davide De Rosa e2c976e58d Attempt beta release 2022-10-31 14:18:07 +01:00
Davide De Rosa baac1f59a8 Bump version 2022-10-31 08:57:05 +01:00
Davide De Rosa 22c28de641
Retain original filename as imported profile name (#240) 2022-10-30 10:22:44 +01:00
Davide De Rosa e4ec1e642d Attempt beta release 2022-10-29 13:40:50 +02:00
Davide De Rosa b2bdf23c54 Revisit pull section in OpenVPN Endpoint
- Hide from server diagnostics

- Use a better section title
2022-10-29 13:40:30 +02:00
Davide De Rosa b2ec7f0422 Attempt beta release 2022-10-29 13:01:18 +02:00
Davide De Rosa cdc05f0c10 Update TunnelKit
Split IP settings and routes. Now properly handling local routes.
2022-10-29 12:28:27 +02:00
Davide De Rosa 0f04bdcce3 Attempt beta release 2022-10-28 15:42:10 +02:00
Davide De Rosa b431ce4f05 Attempt beta release 2022-10-27 00:43:41 +02:00
Davide De Rosa a96fff2add Import new translations 2022-10-26 17:03:54 +02:00
Davide De Rosa e28bb3db9a Ack new refunds only if refunds list was altered
Fixes #238
2022-10-25 12:48:45 +02:00
Davide De Rosa e1d8ec6066 Attempt beta release 2022-10-25 09:07:39 +02:00
Davide De Rosa c0cc10ab94
Restore reconnect action (#232)
* Add "Reconnect" in profile view

* Add "Reconnect" in profile context menu

* Update CHANGELOG

* Restrict "Reconnect" in context menu to iOS 16

SwiftUI does not react properly to state updates.
2022-10-17 17:36:32 +02:00
Davide De Rosa c7a0a3e4b8 Drop 'non-official' from strings 2022-10-17 13:35:30 +02:00
Davide De Rosa f6e0caaa73 Implement --remote-random-hostname
- Update TunnelKit

- Show in UI
2022-10-17 09:06:52 +02:00
Davide De Rosa 6c6904255d Bump version 2022-10-17 09:05:27 +02:00
Davide De Rosa 54dc2307e9 Attempt beta release 2022-10-16 10:09:35 +02:00
Davide De Rosa 6a228d29c7 Use specific rounded Mac icon 2022-10-16 10:09:19 +02:00
Davide De Rosa c345265451 Attempt beta release 2022-10-16 08:36:17 +02:00
Davide De Rosa 54c53707e0
Add app log in Diagnostics screen (#234) 2022-10-16 08:33:32 +02:00
Davide De Rosa fbc17877b1 Suppress buggy Xcode warnings
@discardableResult annotations became suddenly ineffective.
2022-10-15 22:30:21 +02:00
Davide De Rosa 7f748e6d1e Reuse "Download" for pulled OpenVPN settings 2022-10-15 16:52:58 +02:00
Davide De Rosa c4ca510b72 Fix app icon inconsistencies
- iOS: Single size

- macOS: Add missing
2022-10-15 16:41:13 +02:00
Davide De Rosa 592b0801e2 Prefix server description with category 2022-10-13 23:07:31 +02:00
Davide De Rosa 6031d0119a Drop assertion on legit intents scenario 2022-10-13 19:10:45 +02:00
Davide De Rosa f95e4f228d
Implement --route-nopull via TunnelKit (#230)
Use it internally to override server-pushed settings.
2022-10-13 19:09:51 +02:00
Davide De Rosa 5627e6c4a9
Address UI race conditions (#229)
* Make some managers concurrency-safe

- IntentsManager: @MainActor, non-shared, continuation

- SSIDReader: @MainActor, continuation

- Reviewer: main queue, non-shared

* Review wrong use of Concurrency framework

There were background thread calls e.g. in VPNToggle, because
ProfileManager was used inside a VPNManager async call.

Annotate @MainActor wherever a Task involves UI.

* Make main managers MainActor

* Apply MainActor to Mac menus

* [ci skip] Update CHANGELOG

* Set MainActor consistently on Mac menu view models
2022-10-13 08:53:50 +02:00
Davide De Rosa 54dc8a2556 Use MockVPN from TunnelKit
Rather than ad hoc strategy.
2022-10-12 22:37:40 +02:00
Davide De Rosa f21d05aa53 Add IVPN metadata 2022-10-08 11:33:03 +02:00
Davide De Rosa 07328982d6 Restore PIA provider 2022-10-05 08:18:46 +02:00
Davide De Rosa 63c3ac80b4 Attempt beta release 2022-10-04 22:37:53 +02:00
Davide De Rosa e2c1a4c686 Fix Oeck eligibility regression 2022-10-04 22:37:53 +02:00
Davide De Rosa 6183433c13 Drop unused libraries 2022-09-30 22:26:56 +02:00
Davide De Rosa ecb3138817 Attempt beta release 2022-09-25 08:55:15 +02:00
Davide De Rosa 025421aa08 Refactor some alert translations 2022-09-25 08:35:52 +02:00
Davide De Rosa 496d993e3d Attempt beta release 2022-09-23 23:07:40 +02:00
Davide De Rosa 1364d5153e Attempt beta release 2022-09-23 22:57:36 +02:00
Davide De Rosa a3fd5c40d4 Fix access to hidden OpenVPN.Configuration.Fallback 2022-09-23 22:56:27 +02:00
Davide De Rosa be6726fbd8 Attempt beta release 2022-09-23 21:56:37 +02:00
Davide De Rosa f755550974 Increase debug log view size 2022-09-23 09:04:27 +02:00
Davide De Rosa c2aef310f3 Fix again server ordering 2022-09-21 22:32:33 +02:00
Davide De Rosa db6f7bdf28 Revisit app metadata and screenshots
- Add script to import localized metadata

- Update app name, subtitle, keywords

- Update App Store description

    - Replace "OpenVPN" with "VPN"

    - Add .conf file extension (WireGuard)

    - Drop PIA (404)

    - Drop trailing notices

- Update README snapshots (Mac versions unused)

- Update App Store screenshots

- Revert to legacy launch screen (SwiftUI method stretches)
2022-09-15 17:41:22 +02:00
Davide De Rosa 38bdbc3697 Move diagnostics to settings 2022-09-12 22:58:37 +02:00
Davide De Rosa 940e0cf8c9 Attempt beta release 2022-09-05 22:35:22 +02:00
Davide De Rosa 5c681d6c3f Import new localizations 2022-09-05 22:34:51 +02:00
Davide De Rosa 3b146b3e0f Fix var syntax 2022-09-05 07:58:20 +02:00
Davide De Rosa 092d4f5de2 Drop return in one-line functions 2022-09-04 20:30:55 +02:00
Davide De Rosa 1005a12a66 Add extended provider location description
- Profile: Below location row

- Menu: On top of server list
2022-09-04 19:23:40 +02:00
Davide De Rosa 7975ddd194 Fix provider header in profile view 2022-09-04 19:23:27 +02:00
Davide De Rosa b322bde137 Refactor string ids after adding SettingsView 2022-09-03 14:59:17 +02:00
Davide De Rosa 4c4b3ee0c9 Revert to concrete-only managers
Abstraction was overcomplicated. Strategy pattern is enough.
2022-09-03 12:47:40 +02:00
Davide De Rosa 28f7c6bbe8 Restore longer localizations in Settings/About 2022-08-28 09:24:02 +02:00
Davide De Rosa f36d7596d0 Integrate settings with about screen
Move everything to SettingsView and remove invite actions.
2022-08-27 23:15:51 +02:00
Davide De Rosa 10270b02ee On Mac, copy debug log to pasteboard, do not share
UIActivityViewController is lame.
2022-08-27 22:21:34 +02:00
Davide De Rosa 0fee726951 Make profile "Connect" item a connection toggle
Requires adding multiple delegates to LightVPNManager.
2022-08-19 17:43:56 +02:00
Davide De Rosa 4d56ed6fca Only hide app by closing it
Keep constant "Show" action in menu:

- Bring app to foreground if in background
- Activate app if already in foreground
2022-08-19 17:43:52 +02:00
Davide De Rosa d10edc69fe Restore truncated VPN footer workaround 2022-08-19 08:34:55 +02:00
Davide De Rosa f465108a0a Attempt beta release 2022-08-16 12:43:20 +02:00
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 0464cd0476 Fix property in launch on login bindings 2022-08-04 23:35:42 +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 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 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 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 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 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 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