From 9fb36eddea8efaebcb995122ec6a225e857abf73 Mon Sep 17 00:00:00 2001 From: Beingpax Date: Fri, 18 Apr 2025 17:59:48 +0545 Subject: [PATCH] Fix license validation bug --- VoiceInk.xcodeproj/project.pbxproj | 14 ++-- .../xcshareddata/swiftpm/Package.resolved | 70 +++++++++++-------- .../LicenseViewModel.swift | 37 ++-------- 3 files changed, 54 insertions(+), 67 deletions(-) rename VoiceInk/{ViewModels => Models}/LicenseViewModel.swift (82%) diff --git a/VoiceInk.xcodeproj/project.pbxproj b/VoiceInk.xcodeproj/project.pbxproj index ec08e22..3a8aca9 100644 --- a/VoiceInk.xcodeproj/project.pbxproj +++ b/VoiceInk.xcodeproj/project.pbxproj @@ -7,11 +7,11 @@ objects = { /* Begin PBXBuildFile section */ + E11CB51E2DB1F8AF00F9F3ED /* whisper.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = E11CB51D2DB1F8AF00F9F3ED /* whisper.xcframework */; }; + E11CB51F2DB1F8AF00F9F3ED /* whisper.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E11CB51D2DB1F8AF00F9F3ED /* whisper.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; E1A261122CC143AC00B233D1 /* KeyboardShortcuts in Frameworks */ = {isa = PBXBuildFile; productRef = E1A261112CC143AC00B233D1 /* KeyboardShortcuts */; }; E1ADD45A2CC5352A00303ECB /* LaunchAtLogin in Frameworks */ = {isa = PBXBuildFile; productRef = E1ADD4592CC5352A00303ECB /* LaunchAtLogin */; }; E1ADD45F2CC544F100303ECB /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = E1ADD45E2CC544F100303ECB /* Sparkle */; }; - E1F5FA752DA6CBD700B1FD8A /* whisper.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = E136D0102DA3EE57000E1E8A /* whisper.xcframework */; }; - E1F5FA762DA6CBD700B1FD8A /* whisper.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E136D0102DA3EE57000E1E8A /* whisper.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; E1F5FA7A2DA6CBF900B1FD8A /* Zip in Frameworks */ = {isa = PBXBuildFile; productRef = E1F5FA792DA6CBF900B1FD8A /* Zip */; }; /* End PBXBuildFile section */ @@ -33,13 +33,13 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - E1F5FA772DA6CBD700B1FD8A /* Embed Frameworks */ = { + E11CB5202DB1F8AF00F9F3ED /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - E1F5FA762DA6CBD700B1FD8A /* whisper.xcframework in Embed Frameworks */, + E11CB51F2DB1F8AF00F9F3ED /* whisper.xcframework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -50,6 +50,7 @@ E11473B02CBE0F0A00318EE4 /* VoiceInk.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = VoiceInk.app; sourceTree = BUILT_PRODUCTS_DIR; }; E11473C32CBE0F0B00318EE4 /* VoiceInkTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = VoiceInkTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; E11473CD2CBE0F0B00318EE4 /* VoiceInkUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = VoiceInkUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + E11CB51D2DB1F8AF00F9F3ED /* whisper.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = whisper.xcframework; path = "../build-apple/whisper.xcframework"; sourceTree = ""; }; E136D0102DA3EE57000E1E8A /* whisper.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = whisper.xcframework; path = "../Downloads/build-apple/whisper.xcframework"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -76,10 +77,10 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E1F5FA752DA6CBD700B1FD8A /* whisper.xcframework in Frameworks */, E1ADD45A2CC5352A00303ECB /* LaunchAtLogin in Frameworks */, E1ADD45F2CC544F100303ECB /* Sparkle in Frameworks */, E1A261122CC143AC00B233D1 /* KeyboardShortcuts in Frameworks */, + E11CB51E2DB1F8AF00F9F3ED /* whisper.xcframework in Frameworks */, E1F5FA7A2DA6CBF900B1FD8A /* Zip in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -125,6 +126,7 @@ E114741C2CBE1DE200318EE4 /* Frameworks */ = { isa = PBXGroup; children = ( + E11CB51D2DB1F8AF00F9F3ED /* whisper.xcframework */, E136D0102DA3EE57000E1E8A /* whisper.xcframework */, ); name = Frameworks; @@ -140,7 +142,7 @@ E11473AC2CBE0F0A00318EE4 /* Sources */, E11473AD2CBE0F0A00318EE4 /* Frameworks */, E11473AE2CBE0F0A00318EE4 /* Resources */, - E1F5FA772DA6CBD700B1FD8A /* Embed Frameworks */, + E11CB5202DB1F8AF00F9F3ED /* Embed Frameworks */, ); buildRules = ( ); diff --git a/VoiceInk.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/VoiceInk.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 9729c04..56032c0 100644 --- a/VoiceInk.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/VoiceInk.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,34 +1,42 @@ { - "object": { - "pins": [ - { - "package": "KeyboardShortcuts", - "repositoryURL": "https://github.com/sindresorhus/KeyboardShortcuts", - "state": { - "branch": null, - "revision": "7ecc38bb6edf7d087d30e737057b8d8a9b7f51eb", - "version": "2.2.4" - } - }, - { - "package": "LaunchAtLogin", - "repositoryURL": "https://github.com/sindresorhus/LaunchAtLogin-Modern", - "state": { - "branch": "main", - "revision": "a04ec1c363be3627734f6dad757d82f5d4fa8fcc", - "version": null - } - }, - { - "package": "Sparkle", - "repositoryURL": "https://github.com/sparkle-project/Sparkle", - "state": { - "branch": null, - "revision": "0ef1ee0220239b3776f433314515fd849025673f", - "version": "2.6.4" - } + "originHash" : "0bc73a42c360669f47256cb279b2e4e433ec96b0626a6e14ea30fbb197203b4a", + "pins" : [ + { + "identity" : "keyboardshortcuts", + "kind" : "remoteSourceControl", + "location" : "https://github.com/sindresorhus/KeyboardShortcuts", + "state" : { + "revision" : "7ecc38bb6edf7d087d30e737057b8d8a9b7f51eb", + "version" : "2.2.4" } - ] - }, - "version": 1 + }, + { + "identity" : "launchatlogin-modern", + "kind" : "remoteSourceControl", + "location" : "https://github.com/sindresorhus/LaunchAtLogin-Modern", + "state" : { + "branch" : "main", + "revision" : "a04ec1c363be3627734f6dad757d82f5d4fa8fcc" + } + }, + { + "identity" : "sparkle", + "kind" : "remoteSourceControl", + "location" : "https://github.com/sparkle-project/Sparkle", + "state" : { + "revision" : "0ef1ee0220239b3776f433314515fd849025673f", + "version" : "2.6.4" + } + }, + { + "identity" : "zip?tab=readme-ov-file", + "kind" : "remoteSourceControl", + "location" : "https://github.com/marmelroy/Zip?tab=readme-ov-file", + "state" : { + "revision" : "67fa55813b9e7b3b9acee9c0ae501def28746d76", + "version" : "2.1.2" + } + } + ], + "version" : 3 } diff --git a/VoiceInk/ViewModels/LicenseViewModel.swift b/VoiceInk/Models/LicenseViewModel.swift similarity index 82% rename from VoiceInk/ViewModels/LicenseViewModel.swift rename to VoiceInk/Models/LicenseViewModel.swift index a37d835..3c6b152 100644 --- a/VoiceInk/ViewModels/LicenseViewModel.swift +++ b/VoiceInk/Models/LicenseViewModel.swift @@ -20,7 +20,7 @@ class LicenseViewModel: ObservableObject { private let userDefaults = UserDefaults.standard init() { - checkLicenseState() + loadLicenseState() } func startTrial() { @@ -32,40 +32,17 @@ class LicenseViewModel: ObservableObject { } } - private func checkLicenseState() { + private func loadLicenseState() { // Check for existing license key if let licenseKey = userDefaults.licenseKey { self.licenseKey = licenseKey - // Check if this license requires activation - if userDefaults.bool(forKey: "VoiceInkLicenseRequiresActivation") { - // If we have an activation ID, we need to validate it - if let activationId = userDefaults.activationId { - Task { - do { - let isValid = try await polarService.validateLicenseKeyWithActivation(licenseKey, activationId: activationId) - if isValid { - licenseState = .licensed - } else { - // If validation fails, we'll need to reactivate - userDefaults.activationId = nil - licenseState = .trialExpired - } - } catch { - // If there's an error, we'll need to reactivate - userDefaults.activationId = nil - licenseState = .trialExpired - } - } - } else { - // We have a license key but no activation ID, so we need to activate - licenseState = .licensed - } - } else { - // This license doesn't require activation (unlimited devices) + // If we have a license key, trust that it's licensed + // Skip server validation on startup + if userDefaults.activationId != nil || !userDefaults.bool(forKey: "VoiceInkLicenseRequiresActivation") { licenseState = .licensed + return } - return } // Check if this is first launch @@ -194,7 +171,7 @@ class LicenseViewModel: ObservableObject { licenseKey = "" validationMessage = nil NotificationCenter.default.post(name: .licenseStatusChanged, object: nil) - checkLicenseState() + loadLicenseState() } }