From a9bc0e50388fbb18c20fc714cebbb316db5368c7 Mon Sep 17 00:00:00 2001 From: Mark Gregory Date: Wed, 9 Sep 2026 12:33:45 +0100 Subject: [PATCH] paddel setup new verifier --- Rsync Studio/Info.plist | 10 ++++++++-- Rsync Studio/Services/LicensingManager.swift | 4 ++-- Rsync Studio/Views/LicenseRequiredView.swift | 18 +++++++++++++++--- Rsync Studio/Views/LicenseView.swift | 14 +++++++++++++- 4 files changed, 38 insertions(+), 8 deletions(-) diff --git a/Rsync Studio/Info.plist b/Rsync Studio/Info.plist index 92a0a7f..5450062 100644 --- a/Rsync Studio/Info.plist +++ b/Rsync Studio/Info.plist @@ -22,8 +22,14 @@ $(MACOSX_DEPLOYMENT_TARGET) RsyncStudioLicenseAPIBaseURL - https://rsync.vm/api/ + https://rsync.stage.absdev.net/api/ RsyncStudioLicensePublicKey - 8/rlCrS5mVEi4rGNXkw0Z22XkRpSH5+jPnD4f0GyV2k= + /QWCMp3he0bUM0VIYYmH9y1/BCncpUo4h/J8sM8gPKg= + RsyncStudioPurchaseURL + https://rsync.stage.absdev.net/buy + RsyncStudioPortalURL + https://rsync.stage.absdev.net/portal + RsyncStudioSupportURL + https://rsync.stage.absdev.net/support diff --git a/Rsync Studio/Services/LicensingManager.swift b/Rsync Studio/Services/LicensingManager.swift index 9df4c84..5f4d9d0 100644 --- a/Rsync Studio/Services/LicensingManager.swift +++ b/Rsync Studio/Services/LicensingManager.swift @@ -64,7 +64,7 @@ final class LicensingManager: ObservableObject { } } - static let trialLengthDays = 30 + static let trialLengthDays = 7 @Published private(set) var state: State = .trial(daysRemaining: trialLengthDays, expiresAt: Date().addingTimeInterval(TimeInterval(trialLengthDays * 86_400))) @Published private(set) var installationID = "" @@ -100,7 +100,7 @@ final class LicensingManager: ObservableObject { case .trial(let days, let expiresAt): return "\(days) day\(days == 1 ? "" : "s") remaining · ends \(expiresAt.formatted(date: .abbreviated, time: .omitted))" case .expired: - return "The 30-day evaluation period has ended. Activate a licence to continue using sync jobs." + return "The 7-day evaluation period has ended. Activate a licence to continue using sync jobs." case .invalid(let message): return message } diff --git a/Rsync Studio/Views/LicenseRequiredView.swift b/Rsync Studio/Views/LicenseRequiredView.swift index b364fed..a9e56dc 100644 --- a/Rsync Studio/Views/LicenseRequiredView.swift +++ b/Rsync Studio/Views/LicenseRequiredView.swift @@ -1,4 +1,5 @@ import SwiftUI +import AppKit struct LicenseRequiredView: View { @EnvironmentObject private var licensing: LicensingManager @@ -19,9 +20,13 @@ struct LicenseRequiredView: View { .frame(maxWidth: 520) } - Button("Open Licence Settings") { openSettings() } - .buttonStyle(.borderedProminent) - .controlSize(.large) + HStack(spacing: 12) { + Button("Buy Rsync Studio…") { openPurchasePage() } + .buttonStyle(.borderedProminent) + .controlSize(.large) + Button("Open Licence Settings") { openSettings() } + .controlSize(.large) + } Text("Your jobs and history remain on this Mac. Rsync Studio does not delete local data when a trial expires or a licence is removed.") .font(.caption) @@ -33,4 +38,11 @@ struct LicenseRequiredView: View { .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color(nsColor: .windowBackgroundColor)) } + + private func openPurchasePage() { + guard let raw = Bundle.main.object(forInfoDictionaryKey: "RsyncStudioPurchaseURL") as? String, + let url = URL(string: raw), + url.scheme?.lowercased() == "https" else { return } + NSWorkspace.shared.open(url) + } } diff --git a/Rsync Studio/Views/LicenseView.swift b/Rsync Studio/Views/LicenseView.swift index 451e2c2..8ae4fbc 100644 --- a/Rsync Studio/Views/LicenseView.swift +++ b/Rsync Studio/Views/LicenseView.swift @@ -1,4 +1,5 @@ import SwiftUI +import AppKit struct LicenseView: View { @EnvironmentObject private var licensing: LicensingManager @@ -60,7 +61,8 @@ struct LicenseView: View { showingTokenEntry.toggle() } } - Text("Online activation will be enabled when the licensing service URL is configured. Signed offline licence tokens can be installed without contacting a server.") + Button("Buy Rsync Studio…") { openPurchasePage() } + Text("Buy Personal or Professional online, then enter the licence key delivered to your email. Signed offline licence tokens can also be installed without contacting the activation server.") .font(.caption) .foregroundStyle(.secondary) } @@ -130,4 +132,14 @@ struct LicenseView: View { showingTokenEntry = false } catch { errorMessage = error.localizedDescription } } + + private func openPurchasePage() { + guard let raw = Bundle.main.object(forInfoDictionaryKey: "RsyncStudioPurchaseURL") as? String, + let url = URL(string: raw), + url.scheme?.lowercased() == "https" else { + errorMessage = "The Rsync Studio purchase page is not configured in this build." + return + } + NSWorkspace.shared.open(url) + } }