paddel setup new verifier

This commit is contained in:
Mark Gregory
2026-09-09 12:33:45 +01:00
parent 7fbbd42e79
commit a9bc0e5038
4 changed files with 38 additions and 8 deletions
+8 -2
View File
@@ -22,8 +22,14 @@
<string>$(MACOSX_DEPLOYMENT_TARGET)</string> <string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>RsyncStudioLicenseAPIBaseURL</key> <key>RsyncStudioLicenseAPIBaseURL</key>
<string>https://rsync.vm/api/</string> <string>https://rsync.stage.absdev.net/api/</string>
<key>RsyncStudioLicensePublicKey</key> <key>RsyncStudioLicensePublicKey</key>
<string>8/rlCrS5mVEi4rGNXkw0Z22XkRpSH5+jPnD4f0GyV2k=</string> <string>/QWCMp3he0bUM0VIYYmH9y1/BCncpUo4h/J8sM8gPKg=</string>
<key>RsyncStudioPurchaseURL</key>
<string>https://rsync.stage.absdev.net/buy</string>
<key>RsyncStudioPortalURL</key>
<string>https://rsync.stage.absdev.net/portal</string>
<key>RsyncStudioSupportURL</key>
<string>https://rsync.stage.absdev.net/support</string>
</dict> </dict>
</plist> </plist>
+2 -2
View File
@@ -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 state: State = .trial(daysRemaining: trialLengthDays, expiresAt: Date().addingTimeInterval(TimeInterval(trialLengthDays * 86_400)))
@Published private(set) var installationID = "" @Published private(set) var installationID = ""
@@ -100,7 +100,7 @@ final class LicensingManager: ObservableObject {
case .trial(let days, let expiresAt): case .trial(let days, let expiresAt):
return "\(days) day\(days == 1 ? "" : "s") remaining · ends \(expiresAt.formatted(date: .abbreviated, time: .omitted))" return "\(days) day\(days == 1 ? "" : "s") remaining · ends \(expiresAt.formatted(date: .abbreviated, time: .omitted))"
case .expired: 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): case .invalid(let message):
return message return message
} }
+15 -3
View File
@@ -1,4 +1,5 @@
import SwiftUI import SwiftUI
import AppKit
struct LicenseRequiredView: View { struct LicenseRequiredView: View {
@EnvironmentObject private var licensing: LicensingManager @EnvironmentObject private var licensing: LicensingManager
@@ -19,9 +20,13 @@ struct LicenseRequiredView: View {
.frame(maxWidth: 520) .frame(maxWidth: 520)
} }
Button("Open Licence Settings") { openSettings() } HStack(spacing: 12) {
.buttonStyle(.borderedProminent) Button("Buy Rsync Studio…") { openPurchasePage() }
.controlSize(.large) .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.") 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) .font(.caption)
@@ -33,4 +38,11 @@ struct LicenseRequiredView: View {
.frame(maxWidth: .infinity, maxHeight: .infinity) .frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(nsColor: .windowBackgroundColor)) .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)
}
} }
+13 -1
View File
@@ -1,4 +1,5 @@
import SwiftUI import SwiftUI
import AppKit
struct LicenseView: View { struct LicenseView: View {
@EnvironmentObject private var licensing: LicensingManager @EnvironmentObject private var licensing: LicensingManager
@@ -60,7 +61,8 @@ struct LicenseView: View {
showingTokenEntry.toggle() 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) .font(.caption)
.foregroundStyle(.secondary) .foregroundStyle(.secondary)
} }
@@ -130,4 +132,14 @@ struct LicenseView: View {
showingTokenEntry = false showingTokenEntry = false
} catch { errorMessage = error.localizedDescription } } 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)
}
} }