Commit Graph

28 Commits

Author SHA1 Message Date
Davide
1c8f758ff3
Fix German translations 2025-02-08 12:28:17 +01:00
Davide
ce77b4fc6a
Improve the UX of profile editing and management (#1149)
Restart from the v2 flow most users are familiar with.

- Restore the global v2 accent
- Restore the per-profile toggles
- Single tap to edit a profile
- Reuse the same chevron for profile and module navigation
- Improve the iCloud/TV section and rename it to "Synchronization"
- Drop the misleading moon icon from the "Keep alive on sleep" toggle
- Drop the marginal "Enable"/"Disable" action from context menus
- Drop the grid cell highlighting, now marginal with toggles
- Drop the complexity of `nextProfileId`

Ultimately, rework `TunnelToggleButton` into `TunnelToggle` for better
reuse across all platforms.

Things left to improve:

- The duplication of the active profile on top has not changed, but the
toggles may make it more visually apparent
- The "Inactive" subtitle in disabled profiles is there for balance as
it keeps rows and cells of the same height, but it serves no real
purpose
- Access to secondary actions (e.g. provider server, credentials)
- Use of TipKit for less intuitive flows (e.g. context menus, building a
profile from scratch)

Fixes #1111
2025-02-08 11:57:14 +01:00
Davide
6b2ba28728
Restore "Keep alive on sleep" feature (#1143)
Closes #1112
2025-02-06 14:57:53 +01:00
Davide
9e98f4c7ec
Drop unused Kvitto dependency (#1142) 2025-02-05 20:26:19 +01:00
Davide
bc5d08aed7
tvOS: Inform that all apps must run version 3.0.0+ 2025-02-05 16:07:13 +01:00
Davide
965c39ab51
iOS: Suggest that profile modules are editable (#1140)
Fixes #1080
2025-02-05 13:39:28 +01:00
Davide
d6c2a7f58c
Allow graceful period to work around slow receipt validation (#1139)
#1070 is very tricky. When the device boots, StoreKit operations seem to
be severely affected by on-demand VPN profiles. Slowdowns are huge and
unpredictable, as per my [report on the Apple
forums](https://developer.apple.com/forums/thread/773723). I found no
easy way to work around the chicken-and-egg situation where the VPN
requires StoreKit validation to start, but StoreKit requires network
access.

On the other hand, without StoreKit validations, the on-demand tunnel
starts on boot just fine, and so does the app. No eternal activity
indicators. StoreKit is clearly the culprit here.

Therefore, below is the strategy that this PR implements for a decent
trade-off:

- Configure a graceful period for the VPN to start without limitations.
This is initially set to 2 minutes in production, and 10 minutes in
TestFlight. Postpone StoreKit validation until then.
- After the graceful period, StoreKit validation is more likely to
complete fast
- At this point, paying users have their receipts validated and the
connection will silently keep going
- Non-paying users, instead, will see their connection hit the "Purchase
required" message

On the UI side, adjust the app accordingly:

- Drop the "Purchase required" icon from the list/grid of profiles
- The paywall informs that the connection will start, but it will
disconnect after the graceful period if the receipt is not valid
- Add a note that receipt validation may take a while if the device has
just started

This PR also introduces changes in TestFlight behavior:

- Profiles can be saved without limitations
- Profiles using free features work as usual
- Profiles using paid features work for 10 minutes
- Eligibility based on local receipt is ignored (deprecated in iOS 18)

Beta users may therefore test all paid features on iOS/macOS/tvOS for 10
minutes. Until now, paid features were only available to paying iOS
users and unavailable on macOS/tvOS. The tvOS beta was, in fact,
completely useless.

The downside is that paying iOS users will see beta builds restricted
like anybody else. I'll see if I can find a better solution later.
2025-02-05 13:00:42 +01:00
Davide
f58a469e0b
Update credits 2025-02-03 10:49:34 +01:00
Davide
3503f86eee
Fix more German translations 2025-02-03 10:29:27 +01:00
Davide
59ac302eb3
Mention in paywall that all purchases support "Family Sharing" (#1138)
Fixes #1130
2025-02-03 10:27:18 +01:00
Davide
0132aa79cc
Delay profile verifications (#1135)
Fixes #1070
2025-02-03 01:18:39 +01:00
Davide
20e3894b5b
Fix German translation of 'Routing' 2025-02-01 00:46:27 +01:00
Dmytro Chyrkin
111c294d88
Fix Ukranian translations (#1122)
Co-authored-by: Davide <keeshux@gmail.com>
2025-01-29 15:55:42 +01:00
Davide
eb7d6a74e1
tvOS: Override focus behavior to enforce button colors (#1123)
The default gray color on focus defeats the purpose of having green/red
for Connect/Disconnect.
2025-01-29 15:51:00 +01:00
Davide
8d269e7113
Reuse provider entities for more than VPN (#1107)
Rename entities/views, and decouple provider templates from built
configurations. Reuse ProviderServerCoordinator.

This is in preparation for #507
2025-01-29 12:53:23 +01:00
Davide
7ff8dd4fc9
Decrease max log age to 1 day
Reuse log filenames in report issue.
2025-01-29 11:48:30 +01:00
Davide
8513c2a22f
Only apply cellular/Ethernet on-demand rules on devices that support the interface (#1120)
Fixes #1096
Fixes #1060 

Revives #1119, but #1096 is more important.
2025-01-29 09:51:23 +01:00
Davide
5752b3a8d0
Fix misaligned reveal button in secure fields
Fixes #1116
2025-01-29 01:44:42 +01:00
Davide
11fcc132fb
OpenVPN: Prompt for credentials when needed (#1104)
Assume OpenVPN to be interactive if credentials are empty but required
(--auth-user-pass).

For this change, change paywall restriction to OTP only. Allow
interactive login similar to OpenVPN Connect "Save username/password".
2025-01-25 14:49:11 +01:00
Davide
09e8055b7d
Expand on logs generated by ErrorHandler
An error alert is being presented to the user.

Fixes #1098
2025-01-23 11:04:37 +01:00
Davide
66da9d165d
Omit broken links from TV paywall
Fixes #1068
2025-01-19 22:48:38 +01:00
Davide
524243ebaa
Fix error alert when importing files from external apps (#1078)
URL.startAccessingSecurityScopedResource() fails in that case, but
permission is not required at all.

Could reproduce by importing .ovpn file from a Telegram chat.
2025-01-19 11:59:20 +01:00
Davide
bd9f8d63a5
Improve debug logs and move methods to library (#1076)
- Move availableLogs() / purgeLogs() to library
- Append and rotate logs by size (500k)
- Add marker between app/tunnel launches
- Purge logs on each save (3 days)
- Unify debug log content view across platforms
    - macOS: Table + inspect full line
    - iOS/tvOS: Use List
    - Scroll to bottom onLoad()
2025-01-19 00:42:58 +01:00
Davide
a6e44872e9
Select country by typing on macOS
Fixes #1062
2025-01-19 00:18:12 +01:00
Davide
4e43c14cc6
Update copyright 2025-01-15 20:22:52 +01:00
Davide
7b8dbfe84a
Minimize dependencies of VPN implementations (#1057)
### OpenVPN

- Make CPassepartoutCryptoOpenSSL agnostic of PassepartoutKit
- Move Allocation/ZeroingData from PassepartoutKit to package for
internal use
  - Rename ZeroingData.count to .length for consistency with NSData
  - Duplicate some Data manipulation code in CryptoOpenSSL
- Retain a simplified version of ZeroingData in PassepartoutKit
(AutoerasingData)

### WireGuard

- Make WireGuardKit imports `internal`
2025-01-15 09:39:58 +01:00
Davide
4a236787bc
Add EULA and privacy policy in paywall (#1056)
Follow-up from App Review.
2025-01-13 18:21:33 +01:00
Davide
1942b82ebb
Rework App+Kit as monorepository (#1055)
Simplify development and maintenance immensely by making this a
monorepository:

- Convert PassepartoutKit and VPN bindings to local packages
  - OpenVPN/OpenSSL
  - WireGuard/Go
- Make PassepartoutKit available via
  - Source submodule for production (private)
- [Binary XCFramework for
development](https://github.com/passepartoutvpn/passepartoutkit)
 - Add PassepartoutKit Demo in root
   - Deploy package later
2025-01-13 12:26:53 +01:00