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>
<key>RsyncStudioLicenseAPIBaseURL</key>
<string>https://rsync.vm/api/</string>
<string>https://rsync.stage.absdev.net/api/</string>
<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>
</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 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
}
+15 -3
View File
@@ -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)
}
}
+13 -1
View File
@@ -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)
}
}