├── .clang-format ├── .github ├── ISSUE_TEMPLATE │ ├── fixes-and-enhancements.md │ └── sparkle-doesn-t-work-in-my-app.md ├── pull_request_template.md └── workflows │ ├── ci.yml │ └── create-draft-release.yml ├── .gitignore ├── .gitmodules ├── .swiftlint.yml ├── Autoupdate ├── AgentConnection.h ├── AgentConnection.m ├── AppInstaller.h ├── AppInstaller.m ├── SPUDeltaArchive.h ├── SPUDeltaArchive.m ├── SPUDeltaArchiveProtocol.h ├── SPUDeltaCompressionMode.h ├── SPUInstallationInfo.h ├── SPUInstallationInfo.m ├── SPUInstallationInputData.h ├── SPUInstallationInputData.m ├── SPUMessageTypes.h ├── SPUMessageTypes.m ├── SPUSparkleDeltaArchive.h ├── SPUSparkleDeltaArchive.m ├── SPUXarDeltaArchive.h ├── SPUXarDeltaArchive.m ├── SUBinaryDeltaApply.h ├── SUBinaryDeltaApply.m ├── SUBinaryDeltaCommon.h ├── SUBinaryDeltaCommon.m ├── SUBinaryDeltaCreate.h ├── SUBinaryDeltaCreate.m ├── SUBinaryDeltaUnarchiver.h ├── SUBinaryDeltaUnarchiver.m ├── SUCodeSigningVerifier.h ├── SUCodeSigningVerifier.m ├── SUDiskImageUnarchiver.h ├── SUDiskImageUnarchiver.m ├── SUFlatPackageUnarchiver.h ├── SUFlatPackageUnarchiver.m ├── SUGuidedPackageInstaller.h ├── SUGuidedPackageInstaller.m ├── SUInstaller.h ├── SUInstaller.m ├── SUInstallerProtocol.h ├── SUPackageInstaller.h ├── SUPackageInstaller.m ├── SUPipedUnarchiver.h ├── SUPipedUnarchiver.m ├── SUPlainInstaller.h ├── SUPlainInstaller.m ├── SUSignatureVerifier.h ├── SUSignatureVerifier.m ├── SUStatusInfoProtocol.h ├── SUUnarchiver.h ├── SUUnarchiver.m ├── SUUnarchiverNotifier.h ├── SUUnarchiverNotifier.m ├── SUUnarchiverProtocol.h ├── StatusInfo.h ├── StatusInfo.m └── main.m ├── BinaryDelta ├── Bridging-Header.h └── main.swift ├── CHANGELOG ├── CODE_OF_CONDUCT.md ├── Carthage-dev.json ├── Configurations ├── CommandLineTool-Debug.xcconfig ├── CommandLineTool-Release.xcconfig ├── CommandLineTool-Shared.xcconfig ├── ConfigCommon.xcconfig ├── ConfigCommonCoverage.xcconfig ├── ConfigCommonDebug.xcconfig ├── ConfigCommonRelease.xcconfig ├── ConfigDownloader.xcconfig ├── ConfigDownloaderDebug.xcconfig ├── ConfigFramework.xcconfig ├── ConfigFrameworkDebug.xcconfig ├── ConfigFrameworkRelease.xcconfig ├── ConfigInstallerConnection.xcconfig ├── ConfigInstallerConnectionDebug.xcconfig ├── ConfigInstallerLauncher.xcconfig ├── ConfigInstallerLauncherDebug.xcconfig ├── ConfigInstallerProgress.xcconfig ├── ConfigInstallerStatus.xcconfig ├── ConfigInstallerStatusDebug.xcconfig ├── ConfigRelaunch.xcconfig ├── ConfigSparkleTool.xcconfig ├── ConfigSwift.xcconfig ├── ConfigSwiftDebug.xcconfig ├── ConfigSwiftRelease.xcconfig ├── ConfigTestApp.xcconfig ├── ConfigTestAppDebug.xcconfig ├── ConfigTestAppHelper.xcconfig ├── ConfigTestAppHelperDebug.xcconfig ├── ConfigUITest.xcconfig ├── ConfigUITestCoverage.xcconfig ├── ConfigUITestDebug.xcconfig ├── ConfigUITestRelease.xcconfig ├── ConfigUnitTest.xcconfig ├── ConfigUnitTestCoverage.xcconfig ├── ConfigUnitTestDebug.xcconfig ├── ConfigUnitTestRelease.xcconfig ├── bsdiff-Debug.xcconfig ├── bsdiff-Release.xcconfig ├── bsdiff-Shared.xcconfig ├── ed25519-Debug.xcconfig ├── ed25519-Release.xcconfig ├── ed25519-Shared.xcconfig ├── generate_latest_changes.py ├── link-tools.sh ├── make-release-package.sh ├── make-xcframework.sh ├── release-move-tag.sh ├── set-git-version-info.sh ├── strip-framework.sh └── update-carthage.py ├── Documentation ├── .gitignore ├── API_README.markdown ├── Design Practices.md ├── Installation.md ├── Security.md └── graph-of-sparkle.png ├── Downloader ├── Downloader.entitlements ├── Info.plist ├── SPUDownloader.h ├── SPUDownloader.m ├── SPUDownloaderDelegate.h ├── SPUDownloaderProtocol.h └── main.m ├── INSTALL ├── InstallerConnection ├── Info.plist ├── SUInstallerCommunicationProtocol.h ├── SUInstallerConnection.h ├── SUInstallerConnection.m ├── SUInstallerConnectionProtocol.h ├── SUXPCInstallerConnection.h ├── SUXPCInstallerConnection.m └── main.m ├── InstallerLauncher ├── Info.plist ├── SUInstallerLauncher+Private.h ├── SUInstallerLauncher.h ├── SUInstallerLauncher.m ├── SUInstallerLauncherProtocol.h ├── SUInstallerLauncherStatus.h └── main.m ├── InstallerStatus ├── Info.plist ├── SUInstallerStatus.h ├── SUInstallerStatus.m ├── SUInstallerStatusProtocol.h ├── SUXPCInstallerStatus.h ├── SUXPCInstallerStatus.m └── main.m ├── LICENSE ├── Makefile ├── Package.swift ├── README.markdown ├── Resources ├── Images.xcassets │ └── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── icon_128x128.png │ │ ├── icon_128x128@2x.png │ │ ├── icon_16x16.png │ │ ├── icon_16x16@2x.png │ │ ├── icon_256x256.png │ │ ├── icon_256x256@2x.png │ │ ├── icon_32x32.png │ │ ├── icon_32x32@2x.png │ │ ├── icon_512x512.png │ │ └── icon_512x512@2x.png ├── ReleaseNotesColorStyle.css ├── SampleAppcast.xml ├── Screenshot.png ├── Screenshot2.png ├── Screenshot3.png └── Sparkle-Icon.sketch ├── Sparkle.podspec ├── Sparkle.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── swiftpm │ │ └── Package.resolved └── xcshareddata │ └── xcschemes │ ├── BinaryDelta.xcscheme │ ├── Distribution.xcscheme │ ├── Sparkle Test App.xcscheme │ ├── Sparkle.xcscheme │ ├── UITests.xcscheme │ ├── generate_appcast.xcscheme │ ├── generate_keys.xcscheme │ ├── sign_update.xcscheme │ └── sparkle-cli.xcscheme ├── Sparkle ├── AppKitPrevention.h ├── Autoupdate │ ├── TerminationListener.h │ └── TerminationListener.m ├── Base.lproj │ ├── SUUpdateAlert.xib │ ├── SUUpdatePermissionPrompt.xib │ └── Sparkle.strings ├── CheckLocalizations.swift ├── InstallerProgress │ ├── InstallerProgress-Info.plist │ ├── InstallerProgressAppController.h │ ├── InstallerProgressAppController.m │ ├── InstallerProgressDelegate.h │ ├── SPUInstallerAgentProtocol.h │ ├── SUInstallerAgentInitiationProtocol.h │ ├── ShowInstallerProgress.h │ ├── ShowInstallerProgress.m │ └── main.m ├── SPUAppcastItemState.h ├── SPUAppcastItemState.m ├── SPUAppcastItemStateResolver+Private.h ├── SPUAppcastItemStateResolver.h ├── SPUAppcastItemStateResolver.m ├── SPUAutomaticUpdateDriver.h ├── SPUAutomaticUpdateDriver.m ├── SPUBasicUpdateDriver.h ├── SPUBasicUpdateDriver.m ├── SPUCoreBasedUpdateDriver.h ├── SPUCoreBasedUpdateDriver.m ├── SPUDownloadData.h ├── SPUDownloadData.m ├── SPUDownloadDataPrivate.h ├── SPUDownloadDriver.h ├── SPUDownloadDriver.m ├── SPUDownloadedUpdate.h ├── SPUDownloadedUpdate.m ├── SPUGentleUserDriverReminders.h ├── SPUInformationalUpdate.h ├── SPUInformationalUpdate.m ├── SPUInstallationType.h ├── SPUInstallerDriver.h ├── SPUInstallerDriver.m ├── SPULocalCacheDirectory.h ├── SPULocalCacheDirectory.m ├── SPUNoUpdateFoundInfo.h ├── SPUNoUpdateFoundInfo.m ├── SPUProbeInstallStatus.h ├── SPUProbeInstallStatus.m ├── SPUProbingUpdateDriver.h ├── SPUProbingUpdateDriver.m ├── SPUResumableUpdate.h ├── SPUScheduledUpdateDriver.h ├── SPUScheduledUpdateDriver.m ├── SPUSecureCoding.h ├── SPUSecureCoding.m ├── SPUSkippedUpdate.h ├── SPUSkippedUpdate.m ├── SPUStandardUpdaterController.h ├── SPUStandardUpdaterController.m ├── SPUStandardUserDriver+Private.h ├── SPUStandardUserDriver.h ├── SPUStandardUserDriver.m ├── SPUStandardUserDriverDelegate.h ├── SPUStandardVersionDisplay.h ├── SPUStandardVersionDisplay.m ├── SPUUIBasedUpdateDriver.h ├── SPUUIBasedUpdateDriver.m ├── SPUUpdateCheck.h ├── SPUUpdateDriver.h ├── SPUUpdatePermissionRequest.h ├── SPUUpdatePermissionRequest.m ├── SPUUpdater.h ├── SPUUpdater.m ├── SPUUpdaterCycle.h ├── SPUUpdaterCycle.m ├── SPUUpdaterDelegate.h ├── SPUUpdaterSettings.h ├── SPUUpdaterSettings.m ├── SPUUpdaterTimer.h ├── SPUUpdaterTimer.m ├── SPUUserAgent+Private.h ├── SPUUserAgent+Private.m ├── SPUUserDriver.h ├── SPUUserInitiatedUpdateDriver.h ├── SPUUserInitiatedUpdateDriver.m ├── SPUUserUpdateState+Private.h ├── SPUUserUpdateState.h ├── SPUUserUpdateState.m ├── SPUVerifierInformation.h ├── SPUVerifierInformation.m ├── SPUXPCServiceInfo.h ├── SPUXPCServiceInfo.m ├── SUAppcast+Private.h ├── SUAppcast.h ├── SUAppcast.m ├── SUAppcastDriver.h ├── SUAppcastDriver.m ├── SUAppcastItem+Private.h ├── SUAppcastItem.h ├── SUAppcastItem.m ├── SUApplicationInfo.h ├── SUApplicationInfo.m ├── SUBundleIcon.h ├── SUBundleIcon.m ├── SUConstants.h ├── SUConstants.m ├── SUErrors.h ├── SUExport.h ├── SUFileManager.h ├── SUFileManager.m ├── SUHost.h ├── SUHost.m ├── SUInstallerProtocol.h ├── SULegacyWebView.h ├── SULegacyWebView.m ├── SULocalizations.h ├── SULog+NSError.h ├── SULog+NSError.m ├── SULog.h ├── SULog.m ├── SUNormalization.h ├── SUNormalization.m ├── SUOperatingSystem.h ├── SUOperatingSystem.m ├── SUPhasedUpdateGroupInfo.h ├── SUPhasedUpdateGroupInfo.m ├── SUPlainTextReleaseNotesView.h ├── SUPlainTextReleaseNotesView.m ├── SUReleaseNotesCommon.h ├── SUReleaseNotesCommon.m ├── SUReleaseNotesView.h ├── SUSignatures.h ├── SUSignatures.m ├── SUStandardVersionComparator.h ├── SUStandardVersionComparator.m ├── SUStatus.xib ├── SUStatusController.h ├── SUStatusController.m ├── SUSystemProfiler.h ├── SUSystemProfiler.m ├── SUTouchBarButtonGroup.h ├── SUTouchBarButtonGroup.m ├── SUUpdateAlert.h ├── SUUpdateAlert.m ├── SUUpdatePermissionPrompt.h ├── SUUpdatePermissionPrompt.m ├── SUUpdatePermissionResponse.h ├── SUUpdatePermissionResponse.m ├── SUUpdateValidator.h ├── SUUpdateValidator.m ├── SUUpdater.h ├── SUUpdater.m ├── SUUpdaterDelegate.h ├── SUVersionComparisonProtocol.h ├── SUVersionDisplayProtocol.h ├── SUWKWebView.h ├── SUWKWebView.m ├── Sparkle-Info.plist ├── Sparkle.h ├── Sparkle.private.modulemap ├── ar.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── ca.lproj │ ├── SUUpdateAlert.strings │ └── Sparkle.strings ├── cs.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── da.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── de.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── el.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── en.lproj │ ├── SUUpdateAlert.strings │ └── SUUpdatePermissionPrompt.strings ├── es.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── fa.lproj │ └── Sparkle.strings ├── fi.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── fr.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── he.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── hr.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── hu.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── is.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── it.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── ja.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── ko.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── nb.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── nl.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── nn.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── pl.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── pt-BR.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── pt-PT.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── ro.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── ru.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── sk.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── sl.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── sv.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── th.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── tr.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── uk.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── zh_CN.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── zh_HK.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings └── zh_TW.lproj │ ├── SUUpdateAlert.strings │ ├── SUUpdatePermissionPrompt.strings │ └── Sparkle.strings ├── TestAppHelper ├── Info.plist ├── TestAppHelper.h ├── TestAppHelper.m ├── TestAppHelperProtocol.h └── main.m ├── TestApplication ├── Base.lproj │ ├── InfoPlist.strings │ └── MainMenu.xib ├── SUAdHocCodeSigning.h ├── SUAdHocCodeSigning.m ├── SUInstallUpdateViewController.h ├── SUInstallUpdateViewController.m ├── SUInstallUpdateViewController.xib ├── SUPopUpTitlebarUserDriver.h ├── SUPopUpTitlebarUserDriver.m ├── SUTestApplicationDelegate.h ├── SUTestApplicationDelegate.m ├── SUTestWebServer.h ├── SUTestWebServer.m ├── SUUpdateSettingsWindowController.h ├── SUUpdateSettingsWindowController.m ├── SUUpdateSettingsWindowController.xib ├── Sparkle-Test-App.entitlements ├── TestApplication-Info.plist ├── ar.lproj │ └── MainMenu.strings ├── ca.lproj │ └── MainMenu.strings ├── cs.lproj │ └── MainMenu.strings ├── da.lproj │ └── MainMenu.strings ├── de.lproj │ └── MainMenu.strings ├── el.lproj │ └── MainMenu.strings ├── en.lproj │ └── MainMenu.strings ├── es.lproj │ └── MainMenu.strings ├── fa.lproj │ └── MainMenu.strings ├── fi.lproj │ └── MainMenu.strings ├── fr.lproj │ └── MainMenu.strings ├── he.lproj │ └── MainMenu.strings ├── hr.lproj │ └── MainMenu.strings ├── hu.lproj │ └── MainMenu.strings ├── is.lproj │ └── MainMenu.strings ├── it.lproj │ └── MainMenu.strings ├── ja.lproj │ └── MainMenu.strings ├── ko.lproj │ └── MainMenu.strings ├── main.m ├── nb.lproj │ └── MainMenu.strings ├── nl.lproj │ └── MainMenu.strings ├── nn.lproj │ └── MainMenu.strings ├── pl.lproj │ └── MainMenu.strings ├── pt-BR.lproj │ └── MainMenu.strings ├── pt-PT.lproj │ └── MainMenu.strings ├── ro.lproj │ └── MainMenu.strings ├── ru.lproj │ └── MainMenu.strings ├── screenshot.png ├── sk.lproj │ └── MainMenu.strings ├── sl.lproj │ └── MainMenu.strings ├── sparkletestcast.xml ├── sv.lproj │ └── MainMenu.strings ├── th.lproj │ └── MainMenu.strings ├── tr.lproj │ └── MainMenu.strings ├── uk.lproj │ └── MainMenu.strings ├── zh_CN.lproj │ └── MainMenu.strings ├── zh_HK.lproj │ └── MainMenu.strings └── zh_TW.lproj │ └── MainMenu.strings ├── Tests ├── .swiftlint.yml ├── Resources │ ├── DevSignedApp.zip │ ├── DevSignedAppVersion2.dmg │ ├── DevSignedAppVersion2.zip │ ├── SUUpdateValidatorTest │ │ ├── Both.bundle │ │ │ └── Contents │ │ │ │ ├── Info.plist │ │ │ │ └── Resources │ │ │ │ └── test-pubkey.pem │ │ ├── CodeSignedBoth.bundle │ │ │ └── Contents │ │ │ │ ├── Info.plist │ │ │ │ ├── Resources │ │ │ │ └── test-pubkey.pem │ │ │ │ └── _CodeSignature │ │ │ │ ├── CodeDirectory │ │ │ │ ├── CodeRequirements │ │ │ │ ├── CodeRequirements-1 │ │ │ │ ├── CodeResources │ │ │ │ └── CodeSignature │ │ ├── CodeSignedBothNew.bundle │ │ │ └── Contents │ │ │ │ ├── Info.plist │ │ │ │ ├── Resources │ │ │ │ └── test-pubkey.pem │ │ │ │ └── _CodeSignature │ │ │ │ ├── CodeDirectory │ │ │ │ ├── CodeRequirements │ │ │ │ ├── CodeRequirements-1 │ │ │ │ ├── CodeResources │ │ │ │ └── CodeSignature │ │ ├── CodeSignedInvalid.bundle │ │ │ └── Contents │ │ │ │ ├── Info.plist │ │ │ │ ├── Resources │ │ │ │ └── test-pubkey.pem │ │ │ │ └── _CodeSignature │ │ │ │ ├── CodeDirectory │ │ │ │ ├── CodeRequirements │ │ │ │ ├── CodeRequirements-1 │ │ │ │ ├── CodeResources │ │ │ │ └── CodeSignature │ │ ├── CodeSignedInvalidOnly.bundle │ │ │ └── Contents │ │ │ │ ├── Info.plist │ │ │ │ └── _CodeSignature │ │ │ │ ├── CodeDirectory │ │ │ │ ├── CodeRequirements │ │ │ │ ├── CodeRequirements-1 │ │ │ │ ├── CodeResources │ │ │ │ └── CodeSignature │ │ ├── CodeSignedOldED.bundle │ │ │ └── Contents │ │ │ │ ├── Info.plist │ │ │ │ └── _CodeSignature │ │ │ │ ├── CodeDirectory │ │ │ │ ├── CodeRequirements │ │ │ │ ├── CodeRequirements-1 │ │ │ │ ├── CodeResources │ │ │ │ └── CodeSignature │ │ ├── CodeSignedOnly.bundle │ │ │ └── Contents │ │ │ │ ├── Info.plist │ │ │ │ └── _CodeSignature │ │ │ │ ├── CodeDirectory │ │ │ │ ├── CodeRequirements │ │ │ │ ├── CodeRequirements-1 │ │ │ │ ├── CodeResources │ │ │ │ └── CodeSignature │ │ ├── CodeSignedOnlyNew.bundle │ │ │ └── Contents │ │ │ │ ├── Info.plist │ │ │ │ └── _CodeSignature │ │ │ │ ├── CodeDirectory │ │ │ │ ├── CodeRequirements │ │ │ │ ├── CodeRequirements-1 │ │ │ │ ├── CodeResources │ │ │ │ └── CodeSignature │ │ ├── DSAOnly.bundle │ │ │ └── Contents │ │ │ │ ├── Info.plist │ │ │ │ └── Resources │ │ │ │ └── test-pubkey.pem │ │ ├── EDOnly.bundle │ │ │ └── Contents │ │ │ │ └── Info.plist │ │ ├── None.bundle │ │ │ └── Contents │ │ │ │ └── Info.plist │ │ └── resign-all.sh │ ├── SparkleTestCodeSignApp.aar │ ├── SparkleTestCodeSignApp.dmg │ ├── SparkleTestCodeSignApp.enc.aar │ ├── SparkleTestCodeSignApp.enc.dmg │ ├── SparkleTestCodeSignApp.enc.nolicense.dmg │ ├── SparkleTestCodeSignApp.tar │ ├── SparkleTestCodeSignApp.tar.bz2 │ ├── SparkleTestCodeSignApp.tar.gz │ ├── SparkleTestCodeSignApp.tar.xz │ ├── SparkleTestCodeSignApp.zip │ ├── SparkleTestCodeSignApp_bad_extraneous.zip │ ├── SparkleTestCodeSignApp_bad_header.zip │ ├── SparkleTestCodeSign_apfs.dmg │ ├── SparkleTestCodeSign_apfs_lzma_aux_files_adhoc.dmg │ ├── SparkleTestCodeSign_pkg.dmg │ ├── signed-test-file.txt │ ├── test-dangerous-link.xml │ ├── test-links.xml │ ├── test-pubkey.pem │ ├── test-relative-urls.xml │ ├── test.pkg │ ├── testappcast.xml │ ├── testappcast_channels.xml │ ├── testappcast_info_updates.xml │ ├── testappcast_minimumAutoupdateVersion.xml │ ├── testappcast_minimumAutoupdateVersionSkipping.xml │ ├── testappcast_minimumAutoupdateVersionSkipping2.xml │ ├── testappcast_phasedRollout.xml │ ├── testlocalizedreleasenotesappcast.xml │ └── testnamespaces.xml ├── SUAppcastTest.swift ├── SUBinaryDeltaTest.m ├── SUCodeSigningVerifierTest.m ├── SUFileManagerTest.swift ├── SUInstallerTest.m ├── SUSignatureVerifierTest.m ├── SUSpotlightImporterTest.swift ├── SUUnarchiverTest.swift ├── SUUpdateValidatorTest.swift ├── SUUpdaterTest.m ├── SUVersionComparisonTest.m ├── Sparkle Unit Tests-Bridging-Header.h └── SparkleTests-Info.plist ├── UITests ├── .swiftlint.yml ├── SUTestApplicationTest.swift └── UITests-Info.plist ├── Vendor ├── bsdiff │ ├── bscommon.c │ ├── bscommon.h │ ├── bsdiff.c │ ├── bspatch.c │ ├── bspatch.h │ ├── sais.c │ └── sais.h └── ed25519-sparkle │ ├── alterations.txt │ ├── license.txt │ ├── readme.md │ └── src │ ├── add_scalar.c │ ├── ed25519.h │ ├── fe.c │ ├── fe.h │ ├── fixedint.h │ ├── ge.c │ ├── ge.h │ ├── key_exchange.c │ ├── keypair.c │ ├── precomp_data.h │ ├── sc.c │ ├── sc.h │ ├── seed.c │ ├── sha512.c │ ├── sha512.h │ ├── sign.c │ └── verify.c ├── bin └── old_dsa_scripts │ └── sign_update ├── common_cli └── secret.swift ├── generate_appcast ├── Appcast.swift ├── ArchiveItem.swift ├── Bridging-Header.h ├── FeedXML.swift ├── Signatures.swift ├── URL+Hashing.swift ├── Unarchive.swift └── main.swift ├── generate_keys ├── Bridging-Header.h └── main.swift ├── sign_update ├── Bridging-Header.h └── main.swift └── sparkle-cli ├── Info.plist ├── SPUCommandLineDriver.h ├── SPUCommandLineDriver.m ├── SPUCommandLineUserDriver.h ├── SPUCommandLineUserDriver.m └── main.m /.github/ISSUE_TEMPLATE/fixes-and-enhancements.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Enhancements and Bug Fixes 3 | about: Found a bug? Want to implement a new feature? Something else? 4 | title: '' 5 | assignees: '' 6 | 7 | --- 8 | 9 | 21 | 22 | ## Summary 23 | 24 | [provide general summary to the issue or enhancement and its rationale] 25 | 26 | ## Possible Fix 27 | 28 | [not obligatory, but suggest fixes or reasons for the bug] 29 | 30 | ## Version 31 | 32 | [please specify versions of Sparkle this is applicable to] 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/sparkle-doesn-t-work-in-my-app.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Sparkle doesn't work in my app 3 | about: Problems with integration, unexpected errors using Sparkle 4 | title: '' 5 | assignees: '' 6 | 7 | --- 8 | 9 | 18 | 19 | ### Description of the problem 20 | 21 | 22 | ### Do you use Sandboxing in your app? 23 | 24 | ### Version of `Sparkle.framework` in the latest version of your app 25 | 26 | ### Version of `Sparkle.framework` in the old version of app that your users have (or N/A) 27 | 28 | ### Sparkle's output from Console.app 29 | ``` 30 | 31 | ``` 32 | 33 | ### Steps to reproduce the behavior 34 | 35 | [The more information provided and pasted verbatim, the easier it will be to diagnose an issue. If you can provide the affected application/binary and XML feed to reproduce an issue, share them] 36 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | (Insert summary of your pull request here) 2 | 3 | Fixes # (issue) 4 | 5 | ## Misc Checklist 6 | 7 | - [ ] My change requires a documentation update on [Sparkle's website repository](https://github.com/sparkle-project/sparkle-project.github.io) 8 | - [ ] My change requires changes to generate_appcast, generate_keys, or sign_update 9 | 10 | ## Testing 11 | 12 | I tested and verified my change by using one or multiple of these methods: 13 | 14 | - [ ] Sparkle Test App 15 | - [ ] Unit Tests 16 | - [ ] My own app 17 | - [ ] Other (please specify) 18 | 19 | (Describe all the cases that were tested) 20 | 21 | macOS version tested: [place version here] 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | *.pbxuser 3 | !default.pbxuser 4 | *.mode1v3 5 | !default.mode1v3 6 | *.mode2v3 7 | !default.mode2v3 8 | *.perspectivev3 9 | !default.perspectivev3 10 | xcuserdata 11 | *.xccheckout 12 | *.moved-aside 13 | DerivedData 14 | *.xcuserstate 15 | 16 | .DS_Store 17 | .AppleDouble 18 | .LSOverride 19 | 20 | # Icon must end with two \r 21 | Icon 22 | 23 | 24 | # Thumbnails 25 | ._* 26 | 27 | # Files that might appear on external disk 28 | .Spotlight-V100 29 | .Trashes 30 | 31 | # With Carthage, if Sparkle is included as a Git submodule (e.g. with the 32 | # --use-submodules option), the main module's .gitignore can't reach all the 33 | # way inside the submodule to ignore the added Carthage/Build symlink, and Git 34 | # keeps complaining about untracked changes in the submodule forever, which 35 | # is very annoying. To avoid that issue, ignore here in Sparkle instead. 36 | Carthage/Build 37 | 38 | # Directories potentially created on remote AFP share 39 | .AppleDB 40 | .AppleDesktop 41 | Network Trash Folder 42 | Temporary Items 43 | .apdisk 44 | 45 | # Swift Package Manager 46 | /.build 47 | .swiftpm 48 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/.gitmodules -------------------------------------------------------------------------------- /.swiftlint.yml: -------------------------------------------------------------------------------- 1 | excluded: 2 | - Vendor 3 | disabled_rules: 4 | - opening_brace 5 | - empty_parentheses_with_trailing_closure 6 | - function_body_length 7 | - line_length 8 | - cyclomatic_complexity 9 | - large_tuple 10 | 11 | # Rule-specific config 12 | trailing_comma: 13 | mandatory_comma: true 14 | force_try: 15 | severity: warning 16 | force_cast: 17 | severity: warning 18 | identifier_name: 19 | min_length: 20 | warning: 2 21 | -------------------------------------------------------------------------------- /Autoupdate/AgentConnection.h: -------------------------------------------------------------------------------- 1 | // 2 | // AgentConnection.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 7/17/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @protocol AgentConnectionDelegate 14 | 15 | - (void)agentConnectionDidInitiate; 16 | - (void)agentConnectionDidInvalidate; 17 | 18 | @end 19 | 20 | @protocol SPUInstallerAgentProtocol; 21 | 22 | SPU_OBJC_DIRECT_MEMBERS @interface AgentConnection : NSObject 23 | 24 | - (instancetype)initWithHostBundleIdentifier:(NSString *)bundleIdentifier delegate:(id)delegate; 25 | 26 | - (void)startListener; 27 | - (void)invalidate; 28 | 29 | @property (nonatomic, readonly, nullable) id agent; 30 | @property (nonatomic, readonly) BOOL connected; 31 | @property (nonatomic, nullable) NSError *invalidationError; 32 | 33 | @end 34 | 35 | NS_ASSUME_NONNULL_END 36 | -------------------------------------------------------------------------------- /Autoupdate/AppInstaller.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppInstaller.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/7/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SUUnarchiverProtocol.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | SPU_OBJC_DIRECT_MEMBERS @interface AppInstaller : NSObject 15 | 16 | - (instancetype)initWithHostBundleIdentifier:(NSString *)hostBundleIdentifier homeDirectory:(NSString *)homeDirectory userName:(NSString *)userName; 17 | 18 | - (void)start; 19 | 20 | - (void)cleanupAndExitWithStatus:(int)status error:(NSError * _Nullable)error __attribute__((noreturn)); 21 | 22 | @end 23 | 24 | NS_ASSUME_NONNULL_END 25 | -------------------------------------------------------------------------------- /Autoupdate/SPUDeltaArchive.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDeltaArchive.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 12/29/21. 6 | // Copyright © 2021 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol SPUDeltaArchiveProtocol; 12 | @class SPUDeltaArchiveHeader; 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | // Opens patch file for reading and decodes the archive header 17 | id SPUDeltaArchiveReadPatchAndHeader(NSString *patchFile, SPUDeltaArchiveHeader * _Nullable __autoreleasing * _Nullable outHeader); 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /Autoupdate/SPUDeltaCompressionMode.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDeltaCompressionMode.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 1/3/22. 6 | // Copyright © 2022 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | // Compression mode to use during patch creation 12 | typedef NS_ENUM(uint8_t, SPUDeltaCompressionMode) { 13 | SPUDeltaCompressionModeNone = 0, 14 | SPUDeltaCompressionModeBzip2, 15 | SPUDeltaCompressionModeLZMA, 16 | SPUDeltaCompressionModeLZFSE, 17 | SPUDeltaCompressionModeLZ4, 18 | SPUDeltaCompressionModeZLIB 19 | }; 20 | 21 | // For Swift access 22 | extern SPUDeltaCompressionMode SPUDeltaCompressionModeDefault; 23 | -------------------------------------------------------------------------------- /Autoupdate/SPUInstallationInfo.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUInstallationInfo.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 4/10/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class SUAppcastItem; 14 | 15 | SPU_OBJC_DIRECT_MEMBERS @interface SPUInstallationInfo : NSObject 16 | 17 | - (instancetype)initWithAppcastItem:(SUAppcastItem *)appcastItem canSilentlyInstall:(BOOL)canSilentlyInstall; 18 | 19 | @property (nonatomic, readonly) SUAppcastItem *appcastItem; 20 | @property (nonatomic, readonly) BOOL canSilentlyInstall; 21 | 22 | @property (nonatomic) BOOL systemDomain; 23 | 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /Autoupdate/SPUXarDeltaArchive.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUXarDeltaArchive.h 3 | // Autoupdate 4 | // 5 | // Created by Mayur Pawashe on 12/28/21. 6 | // Copyright © 2021 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if SPARKLE_BUILD_LEGACY_DELTA_SUPPORT 10 | 11 | #import 12 | 13 | #import "SPUDeltaArchiveProtocol.h" 14 | #import "SPUDeltaCompressionMode.h" 15 | 16 | NS_ASSUME_NONNULL_BEGIN 17 | 18 | // Legacy container format for binary delta archives 19 | SPU_OBJC_DIRECT_MEMBERS @interface SPUXarDeltaArchive : NSObject 20 | 21 | - (instancetype)initWithPatchFileForWriting:(NSString *)patchFile SPU_OBJC_DIRECT; 22 | - (instancetype)initWithPatchFileForReading:(NSString *)patchFile SPU_OBJC_DIRECT; 23 | 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | 28 | #endif 29 | -------------------------------------------------------------------------------- /Autoupdate/SUBinaryDeltaApply.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUBinaryDeltaApply.h 3 | // Sparkle 4 | // 5 | // Created by Mark Rowe on 2009-06-01. 6 | // Copyright 2009 Mark Rowe. All rights reserved. 7 | // 8 | 9 | #ifndef SUBINARYDELTAAPPLY_H 10 | #define SUBINARYDELTAAPPLY_H 11 | 12 | #import 13 | 14 | @class NSString; 15 | BOOL applyBinaryDelta(NSString *source, NSString *destination, NSString *patchFile, BOOL verbose, void (^progressCallback)(double), NSError * __autoreleasing *error); 16 | 17 | #endif 18 | -------------------------------------------------------------------------------- /Autoupdate/SUBinaryDeltaCreate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUBinaryDeltaCreate.m 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 4/9/15. 6 | // Copyright (c) 2015 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SUBINARYDELTACREATE_H 10 | #define SUBINARYDELTACREATE_H 11 | 12 | #import "SUBinaryDeltaCommon.h" 13 | #import "SPUDeltaArchiveProtocol.h" 14 | 15 | @class NSString; 16 | BOOL createBinaryDelta(NSString *source, NSString *destination, NSString *patchFile, SUBinaryDeltaMajorVersion majorVersion, SPUDeltaCompressionMode compression, uint8_t compressionLevel, BOOL verbose, NSError * __autoreleasing *error); 17 | 18 | #endif 19 | -------------------------------------------------------------------------------- /Autoupdate/SUBinaryDeltaUnarchiver.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUBinaryDeltaUnarchiver.h 3 | // Sparkle 4 | // 5 | // Created by Mark Rowe on 2009-06-03. 6 | // Copyright 2009 Mark Rowe. All rights reserved. 7 | // 8 | 9 | #ifndef SUBINARYDELTAUNARCHIVER_H 10 | #define SUBINARYDELTAUNARCHIVER_H 11 | 12 | #import 13 | #import "SUUnarchiverProtocol.h" 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | #ifndef BUILDING_SPARKLE_TESTS 18 | SPU_OBJC_DIRECT_MEMBERS 19 | #endif 20 | @interface SUBinaryDeltaUnarchiver : NSObject 21 | 22 | - (instancetype)initWithArchivePath:(NSString *)archivePath extractionDirectory:(NSString *)extractionDirectory updateHostBundlePath:(NSString *)updateHostBundlePath; 23 | 24 | + (BOOL)canUnarchivePath:(NSString *)path; 25 | 26 | @end 27 | 28 | NS_ASSUME_NONNULL_END 29 | 30 | #endif 31 | -------------------------------------------------------------------------------- /Autoupdate/SUDiskImageUnarchiver.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUDiskImageUnarchiver.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 6/16/08. 6 | // Copyright 2008 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUDISKIMAGEUNARCHIVER_H 10 | #define SUDISKIMAGEUNARCHIVER_H 11 | 12 | #import 13 | #import "SUUnarchiverProtocol.h" 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | SPU_OBJC_DIRECT_MEMBERS @interface SUDiskImageUnarchiver : NSObject 18 | 19 | - (instancetype)initWithArchivePath:(NSString *)archivePath extractionDirectory:(NSString *)extractionDirectory decryptionPassword:(nullable NSString *)decryptionPassword; 20 | 21 | + (BOOL)canUnarchivePath:(NSString *)path; 22 | 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /Autoupdate/SUFlatPackageUnarchiver.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUFlatPackageUnarchiver.h 3 | // Autoupdate 4 | // 5 | // Created by Mayur Pawashe on 1/30/21. 6 | // Copyright © 2021 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if SPARKLE_BUILD_PACKAGE_SUPPORT 10 | 11 | #import 12 | #import "SUUnarchiverProtocol.h" 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | // An unarchiver for flat packages that doesn't really do any unarchiving 17 | SPU_OBJC_DIRECT_MEMBERS @interface SUFlatPackageUnarchiver : NSObject 18 | 19 | - (instancetype)initWithFlatPackagePath:(NSString *)flatPackagePath extractionDirectory:(NSString *)extractionDirectory expectingInstallationType:(NSString *)installationType; 20 | 21 | + (BOOL)canUnarchivePath:(NSString *)path; 22 | 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /Autoupdate/SUGuidedPackageInstaller.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUGuidedPackageInstaller.h 3 | // Sparkle 4 | // 5 | // Created by Graham Miln on 14/05/2010. 6 | // Copyright 2010 Dragon Systems Software Limited. All rights reserved. 7 | // 8 | 9 | /** 10 | # Sparkle Guided Installations 11 | 12 | A guided installation allows Sparkle to download and install a package (pkg) or multi-package (mpkg) without user interaction. 13 | 14 | The installer package is installed using macOS's built-in command line installer, `/usr/sbin/installer`. No installation interface is shown to the user. 15 | 16 | A guided installation can be started by applications other than the application being replaced. This is particularly useful where helper applications or agents are used. 17 | */ 18 | 19 | #if SPARKLE_BUILD_PACKAGE_SUPPORT 20 | 21 | #import 22 | #import "SUInstallerProtocol.h" 23 | 24 | SPU_OBJC_DIRECT_MEMBERS @interface SUGuidedPackageInstaller : NSObject 25 | 26 | - (instancetype)initWithPackagePath:(NSString *)packagePath homeDirectory:(NSString *)homeDirectory userName:(NSString *)userName; 27 | 28 | @end 29 | 30 | #endif 31 | -------------------------------------------------------------------------------- /Autoupdate/SUInstaller.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUInstaller.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 4/10/08. 6 | // Copyright 2008 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SUInstallerProtocol.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @class SUHost; 15 | 16 | SPU_OBJC_DIRECT_MEMBERS @interface SUInstaller : NSObject 17 | 18 | + (nullable id)installerForHost:(SUHost *)host expectedInstallationType:(NSString *)expectedInstallationType updateDirectory:(NSString *)updateDirectory homeDirectory:(NSString *)homeDirectory userName:(NSString *)userName error:(NSError **)error; 19 | 20 | + (nullable NSString *)installSourcePathInUpdateFolder:(NSString *)inUpdateFolder forHost:(SUHost *)host 21 | #if SPARKLE_BUILD_PACKAGE_SUPPORT 22 | isPackage:(BOOL *)isPackagePtr isGuided:(nullable BOOL *)isGuidedPtr 23 | #endif 24 | ; 25 | 26 | @end 27 | 28 | NS_ASSUME_NONNULL_END 29 | -------------------------------------------------------------------------------- /Autoupdate/SUPackageInstaller.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUPackageInstaller.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 4/10/08. 6 | // Copyright 2008 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #if SPARKLE_BUILD_PACKAGE_SUPPORT 10 | 11 | #import 12 | #import "SUInstallerProtocol.h" 13 | 14 | // This is the deprecated package installation type, aka the "interactive" package installer 15 | // For a more supported package installation, see SUGuidedPackageInstaller 16 | 17 | SPU_OBJC_DIRECT_MEMBERS @interface SUPackageInstaller : NSObject 18 | 19 | - (instancetype)initWithPackagePath:(NSString *)packagePath; 20 | 21 | @end 22 | 23 | #endif 24 | -------------------------------------------------------------------------------- /Autoupdate/SUPipedUnarchiver.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUPipedUnarchiver.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 6/16/08. 6 | // Copyright 2008 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUPIPEDUNARCHIVER_H 10 | #define SUPIPEDUNARCHIVER_H 11 | 12 | #import 13 | #import "SUUnarchiverProtocol.h" 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | SPU_OBJC_DIRECT_MEMBERS @interface SUPipedUnarchiver : NSObject 18 | 19 | - (instancetype)initWithArchivePath:(NSString *)archivePath extractionDirectory:(NSString *)extractionDirectory; 20 | 21 | + (BOOL)canUnarchivePath:(NSString *)path; 22 | 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /Autoupdate/SUPlainInstaller.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUPlainInstaller.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 4/10/08. 6 | // Copyright 2008 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SUInstallerProtocol.h" 11 | 12 | @class SUHost; 13 | @protocol SUVersionComparison; 14 | 15 | SPU_OBJC_DIRECT_MEMBERS @interface SUPlainInstaller : NSObject 16 | 17 | /** 18 | @param host The current (old) bundle host 19 | @param bundlePath The path to the new bundle that will be installed. 20 | @param installationPath The path the new bundlePath will be installed to. 21 | */ 22 | - (instancetype)initWithHost:(SUHost *)host bundlePath:(NSString *)bundlePath installationPath:(NSString *)installationPath; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /Autoupdate/SUStatusInfoProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUStatusInfoProtocol.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 7/10/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @protocol SUStatusInfoProtocol 14 | 15 | - (void)probeStatusInfoWithReply:(void (^)(NSData * _Nullable installationInfoData))reply; 16 | 17 | - (void)probeStatusConnectivityWithReply:(void (^)(void))reply; 18 | 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /Autoupdate/SUUnarchiver.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUnarchiver.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/16/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @protocol SUUnarchiverProtocol; 14 | 15 | SPU_OBJC_DIRECT_MEMBERS @interface SUUnarchiver : NSObject 16 | 17 | + (nullable id )unarchiverForPath:(NSString *)path extractionDirectory:(NSString *)extractionDirectory updatingHostBundlePath:(nullable NSString *)hostPath decryptionPassword:(nullable NSString *)decryptionPassword expectingInstallationType:(NSString *)installationType; 18 | 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /Autoupdate/SUUnarchiverNotifier.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUnarchiverNotifier.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 12/21/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | SPU_OBJC_DIRECT_MEMBERS @interface SUUnarchiverNotifier : NSObject 14 | 15 | - (instancetype)initWithCompletionBlock:(void (^)(NSError * _Nullable))completionBlock progressBlock:(void (^ _Nullable)(double))progressBlock; 16 | 17 | - (void)notifySuccess; 18 | 19 | - (void)notifyFailureWithError:(NSError * _Nullable)reason; 20 | 21 | - (void)notifyProgress:(double)progress; 22 | 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | -------------------------------------------------------------------------------- /Autoupdate/SUUnarchiverProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUnarchiverProtocol.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/26/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @protocol SUUnarchiverProtocol 14 | 15 | + (BOOL)mustValidateBeforeExtraction; 16 | 17 | - (void)unarchiveWithCompletionBlock:(void (^)(NSError * _Nullable))completionBlock progressBlock:(void (^ _Nullable)(double))progressBlock waitForCleanup:(BOOL)waitForCleanup; 18 | 19 | @property (nonatomic, readonly) BOOL needsVerifyBeforeExtractionKey; 20 | 21 | - (NSString *)description; 22 | 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | -------------------------------------------------------------------------------- /Autoupdate/StatusInfo.h: -------------------------------------------------------------------------------- 1 | // 2 | // StatusInfo.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 7/10/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SUStatusInfoProtocol.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | SPU_OBJC_DIRECT_MEMBERS @interface StatusInfo : NSObject 15 | 16 | - (instancetype)initWithHostBundleIdentifier:(NSString *)bundleIdentifier; 17 | 18 | @property (nonatomic, nullable) NSData *installationInfoData; 19 | 20 | - (void)startListener; 21 | 22 | - (void)invalidate; 23 | 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /BinaryDelta/Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #import "SUBinaryDeltaApply.h" 6 | #import "SUBinaryDeltaCreate.h" 7 | #import "SPUDeltaArchive.h" 8 | #import "SPUDeltaArchiveProtocol.h" 9 | -------------------------------------------------------------------------------- /Configurations/CommandLineTool-Debug.xcconfig: -------------------------------------------------------------------------------- 1 | // Generate Appcast Debug 2 | 3 | #include "CommandLineTool-Shared.xcconfig" 4 | #include "ConfigSwiftDebug.xcconfig" 5 | -------------------------------------------------------------------------------- /Configurations/CommandLineTool-Release.xcconfig: -------------------------------------------------------------------------------- 1 | // Generate Appcast Release 2 | 3 | #include "CommandLineTool-Shared.xcconfig" 4 | #include "ConfigSwiftRelease.xcconfig" 5 | -------------------------------------------------------------------------------- /Configurations/CommandLineTool-Shared.xcconfig: -------------------------------------------------------------------------------- 1 | // Generate Appcast only 2 | 3 | #include "ConfigSwift.xcconfig" 4 | 5 | SWIFT_OBJC_BRIDGING_HEADER = $(PRODUCT_NAME)/Bridging-Header.h 6 | GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS) BUILDING_EXTERNALLY=1 7 | -------------------------------------------------------------------------------- /Configurations/ConfigCommonCoverage.xcconfig: -------------------------------------------------------------------------------- 1 | #include "ConfigCommonDebug.xcconfig" 2 | 3 | GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS_COMMON) 4 | OTHER_SWIFT_FLAGS = $(OTHER_SWIFT_FLAGS_COMMON) 5 | 6 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 7 | CLANG_WARN_COMMA = YES; 8 | CLANG_WARN_INFINITE_RECURSION = YES; 9 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 10 | CLANG_WARN_STRICT_PROTOTYPES = YES; 11 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 12 | GCC_GENERATE_TEST_COVERAGE_FILES = YES 13 | GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES 14 | -------------------------------------------------------------------------------- /Configurations/ConfigCommonDebug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "ConfigCommon.xcconfig" 2 | 3 | // Debug only 4 | 5 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 6 | CLANG_WARN_COMMA = YES; 7 | CLANG_WARN_INFINITE_RECURSION = YES; 8 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 9 | CLANG_WARN_STRICT_PROTOTYPES = YES; 10 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 11 | GCC_OPTIMIZATION_LEVEL = 0 12 | DEBUG_INFORMATION_FORMAT = dwarf 13 | ENABLE_TESTABILITY = YES 14 | GCC_GENERATE_DEBUGGING_SYMBOLS = YES 15 | GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS_COMMON) DEBUG=1 16 | OTHER_SWIFT_FLAGS = $(OTHER_SWIFT_FLAGS_COMMON) 17 | ONLY_ACTIVE_ARCH = YES 18 | COPY_PHASE_STRIP = NO 19 | -------------------------------------------------------------------------------- /Configurations/ConfigCommonRelease.xcconfig: -------------------------------------------------------------------------------- 1 | #include "ConfigCommon.xcconfig" 2 | 3 | // Release only 4 | 5 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 6 | CLANG_WARN_COMMA = YES; 7 | CLANG_WARN_INFINITE_RECURSION = YES; 8 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 9 | CLANG_WARN_STRICT_PROTOTYPES = YES; 10 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 11 | GCC_OPTIMIZATION_LEVEL = s 12 | DEBUG_INFORMATION_FORMAT = dwarf-with-dsym 13 | GCC_GENERATE_DEBUGGING_SYMBOLS = YES 14 | GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS_COMMON) DEBUG=0 15 | OTHER_SWIFT_FLAGS = $(OTHER_SWIFT_FLAGS_COMMON) 16 | DEAD_CODE_STRIPPING = YES 17 | GCC_TREAT_WARNINGS_AS_ERRORS = NO 18 | GCC_WARN_UNINITIALIZED_AUTOS = YES 19 | COPY_PHASE_STRIP = NO 20 | DEPLOYMENT_POSTPROCESSING = YES 21 | -------------------------------------------------------------------------------- /Configurations/ConfigDownloader.xcconfig: -------------------------------------------------------------------------------- 1 | // Downloader 2 | 3 | INFOPLIST_FILE = Downloader/Info.plist 4 | WRAPPER_EXTENSION = xpc 5 | PRODUCT_BUNDLE_IDENTIFIER = ${DOWNLOADER_BUNDLE_ID} 6 | PRODUCT_NAME = ${DOWNLOADER_NAME} 7 | CODE_SIGN_ENTITLEMENTS = $(DOWNLOADER_SANDBOXED_ENTITLEMENTS) 8 | GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS) BUILDING_SPARKLE_SOURCES_EXTERNALLY=1 9 | CLANG_MODULES_AUTOLINK = NO 10 | -------------------------------------------------------------------------------- /Configurations/ConfigDownloaderDebug.xcconfig: -------------------------------------------------------------------------------- 1 | // Downloader Debug 2 | #include "ConfigDownloader.xcconfig" 3 | -------------------------------------------------------------------------------- /Configurations/ConfigFrameworkDebug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "ConfigFramework.xcconfig" 2 | 3 | // Unit tests need access to non-public classes 4 | GCC_SYMBOLS_PRIVATE_EXTERN = NO 5 | -------------------------------------------------------------------------------- /Configurations/ConfigFrameworkRelease.xcconfig: -------------------------------------------------------------------------------- 1 | #include "ConfigFramework.xcconfig" 2 | 3 | // Strip all non-global symbols (including debug symbols) 4 | STRIP_STYLE = non-global 5 | -------------------------------------------------------------------------------- /Configurations/ConfigInstallerConnection.xcconfig: -------------------------------------------------------------------------------- 1 | // InstallerConnection 2 | 3 | INFOPLIST_FILE = InstallerConnection/Info.plist 4 | WRAPPER_EXTENSION = xpc 5 | PRODUCT_BUNDLE_IDENTIFIER = ${INSTALLER_CONNECTION_BUNDLE_ID} 6 | PRODUCT_NAME = ${INSTALLER_CONNECTION_NAME} 7 | GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS) BUILDING_SPARKLE_SOURCES_EXTERNALLY=1 8 | CLANG_MODULES_AUTOLINK = NO 9 | -------------------------------------------------------------------------------- /Configurations/ConfigInstallerConnectionDebug.xcconfig: -------------------------------------------------------------------------------- 1 | // InstallerConnection Debug 2 | 3 | #include "ConfigInstallerConnection.xcconfig" 4 | -------------------------------------------------------------------------------- /Configurations/ConfigInstallerLauncher.xcconfig: -------------------------------------------------------------------------------- 1 | // Installer Launcher 2 | 3 | INFOPLIST_FILE = InstallerLauncher/Info.plist 4 | WRAPPER_EXTENSION = xpc 5 | PRODUCT_BUNDLE_IDENTIFIER = ${INSTALLER_LAUNCHER_BUNDLE_ID} 6 | PRODUCT_NAME = ${INSTALLER_LAUNCHER_NAME} 7 | GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS) BUILDING_SPARKLE_SOURCES_EXTERNALLY=1 8 | CLANG_MODULES_AUTOLINK = NO 9 | -------------------------------------------------------------------------------- /Configurations/ConfigInstallerLauncherDebug.xcconfig: -------------------------------------------------------------------------------- 1 | // Installer Launcher Debug 2 | #include "ConfigInstallerLauncher.xcconfig" 3 | -------------------------------------------------------------------------------- /Configurations/ConfigInstallerProgress.xcconfig: -------------------------------------------------------------------------------- 1 | // Installer Progress only 2 | 3 | INFOPLIST_FILE = Sparkle/InstallerProgress/InstallerProgress-Info.plist 4 | PRODUCT_NAME = $(SPARKLE_INSTALLER_PROGRESS_TOOL_NAME) 5 | PRODUCT_BUNDLE_IDENTIFIER = $(SPARKLE_INSTALLER_PROGRESS_TOOL_BUNDLE_ID) 6 | GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS) BUILDING_SPARKLE=0 BUILDING_SPARKLE_SOURCES_EXTERNALLY=1 7 | SKIP_INSTALL = YES 8 | CLANG_ENABLE_MODULES = NO 9 | -------------------------------------------------------------------------------- /Configurations/ConfigInstallerStatus.xcconfig: -------------------------------------------------------------------------------- 1 | // InstallerStatus 2 | 3 | INFOPLIST_FILE = InstallerStatus/Info.plist 4 | WRAPPER_EXTENSION = xpc 5 | PRODUCT_BUNDLE_IDENTIFIER = ${INSTALLER_STATUS_BUNDLE_ID} 6 | PRODUCT_NAME = ${INSTALLER_STATUS_NAME} 7 | GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS) BUILDING_SPARKLE=0 BUILDING_SPARKLE_SOURCES_EXTERNALLY=1 8 | CLANG_MODULES_AUTOLINK = NO 9 | -------------------------------------------------------------------------------- /Configurations/ConfigInstallerStatusDebug.xcconfig: -------------------------------------------------------------------------------- 1 | // InstallerStatus Debug 2 | 3 | #include "ConfigInstallerStatus.xcconfig" 4 | -------------------------------------------------------------------------------- /Configurations/ConfigRelaunch.xcconfig: -------------------------------------------------------------------------------- 1 | // Relaunch Tool only 2 | 3 | PRODUCT_NAME = $(SPARKLE_RELAUNCH_TOOL_NAME) 4 | SKIP_INSTALL = YES 5 | CLANG_ENABLE_MODULES = NO 6 | GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS) BUILDING_SPARKLE_SOURCES_EXTERNALLY=1 7 | -------------------------------------------------------------------------------- /Configurations/ConfigSparkleTool.xcconfig: -------------------------------------------------------------------------------- 1 | // sparkle command line tool only 2 | 3 | INFOPLIST_FILE = sparkle-cli/Info.plist 4 | PRODUCT_BUNDLE_IDENTIFIER = org.sparkle-project.sparkle-cli 5 | PRODUCT_NAME = sparkle 6 | LD_RUNPATH_SEARCH_PATHS = @executable_path/../Frameworks/ 7 | ENABLE_HARDENED_RUNTIME = NO 8 | -------------------------------------------------------------------------------- /Configurations/ConfigSwift.xcconfig: -------------------------------------------------------------------------------- 1 | SWIFT_VERSION = 5 2 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 3 | -------------------------------------------------------------------------------- /Configurations/ConfigSwiftDebug.xcconfig: -------------------------------------------------------------------------------- 1 | SWIFT_OPTIMIZATION_LEVEL = -Onone 2 | -------------------------------------------------------------------------------- /Configurations/ConfigSwiftRelease.xcconfig: -------------------------------------------------------------------------------- 1 | SWIFT_OPTIMIZATION_LEVEL = -O 2 | SWIFT_COMPILATION_MODE = wholemodule 3 | -------------------------------------------------------------------------------- /Configurations/ConfigTestApp.xcconfig: -------------------------------------------------------------------------------- 1 | // Test Application 2 | 3 | INFOPLIST_FILE = TestApplication/TestApplication-Info.plist 4 | WRAPPER_EXTENSION = app 5 | ASSETCATALOG_COMPILER_APPICON_NAME = $(SPARKLE_ICON_NAME) 6 | LD_RUNPATH_SEARCH_PATHS = @executable_path/../Frameworks 7 | PRODUCT_BUNDLE_IDENTIFIER = org.sparkle-project.SparkleTestApp 8 | CODE_SIGN_ENTITLEMENTS = TestApplication/Sparkle-Test-App.entitlements 9 | ENABLE_HARDENED_RUNTIME = NO 10 | -------------------------------------------------------------------------------- /Configurations/ConfigTestAppDebug.xcconfig: -------------------------------------------------------------------------------- 1 | // Test Application Debug 2 | #include "ConfigTestApp.xcconfig" 3 | -------------------------------------------------------------------------------- /Configurations/ConfigTestAppHelper.xcconfig: -------------------------------------------------------------------------------- 1 | // Test Application Helper 2 | 3 | INFOPLIST_FILE = TestAppHelper/Info.plist 4 | WRAPPER_EXTENSION = xpc 5 | LD_RUNPATH_SEARCH_PATHS = @executable_path/../../../../Frameworks 6 | PRODUCT_BUNDLE_IDENTIFIER = org.sparkle-project.TestAppHelper 7 | ENABLE_HARDENED_RUNTIME = NO 8 | -------------------------------------------------------------------------------- /Configurations/ConfigTestAppHelperDebug.xcconfig: -------------------------------------------------------------------------------- 1 | // Test Application Helper Debug 2 | #include "ConfigTestAppHelper.xcconfig" 3 | -------------------------------------------------------------------------------- /Configurations/ConfigUITest.xcconfig: -------------------------------------------------------------------------------- 1 | // UI Test only 2 | 3 | #include "ConfigSwift.xcconfig" 4 | 5 | INFOPLIST_FILE = UITests/UITests-Info.plist 6 | WRAPPER_EXTENSION = xctest 7 | ENABLE_HARDENED_RUNTIME = NO 8 | 9 | FRAMEWORK_SEARCH_PATHS = $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) 10 | LD_RUNPATH_SEARCH_PATHS = @loader_path/../Frameworks 11 | 12 | TEST_TARGET_NAME = Sparkle Test App 13 | USES_XCTRUNNER = YES 14 | -------------------------------------------------------------------------------- /Configurations/ConfigUITestCoverage.xcconfig: -------------------------------------------------------------------------------- 1 | #include "ConfigUITest.xcconfig" 2 | #include "ConfigSwiftDebug.xcconfig" 3 | 4 | GCC_GENERATE_TEST_COVERAGE_FILES = NO 5 | GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO 6 | -------------------------------------------------------------------------------- /Configurations/ConfigUITestDebug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "ConfigUITest.xcconfig" 2 | #include "ConfigSwiftDebug.xcconfig" 3 | -------------------------------------------------------------------------------- /Configurations/ConfigUITestRelease.xcconfig: -------------------------------------------------------------------------------- 1 | #include "ConfigUITest.xcconfig" 2 | #include "ConfigSwiftRelease.xcconfig" 3 | -------------------------------------------------------------------------------- /Configurations/ConfigUnitTest.xcconfig: -------------------------------------------------------------------------------- 1 | // Unit Test only 2 | 3 | #include "ConfigSwift.xcconfig" 4 | 5 | INFOPLIST_FILE = Tests/SparkleTests-Info.plist 6 | WRAPPER_EXTENSION = xctest 7 | OTHER_CFLAGS = $(inherited) -iframework"$(DEVELOPER_FRAMEWORKS_DIR)" -iframework"$(PLATFORM_DIR)/Developer/Library/Frameworks" 8 | GCC_SYMBOLS_PRIVATE_EXTERN = NO 9 | WARNING_CFLAGS = $(inherited) -Wno-variadic-macros -Wno-gnu-zero-variadic-macro-arguments 10 | FRAMEWORK_SEARCH_PATHS = $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) 11 | LD_RUNPATH_SEARCH_PATHS = @loader_path/../Frameworks 12 | CLANG_ENABLE_MODULES = YES 13 | SWIFT_OBJC_BRIDGING_HEADER = Tests/Sparkle Unit Tests-Bridging-Header.h 14 | GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS) BUILDING_SPARKLE_TESTS=1 BUILDING_SPARKLE_SOURCES_EXTERNALLY=1 15 | -------------------------------------------------------------------------------- /Configurations/ConfigUnitTestCoverage.xcconfig: -------------------------------------------------------------------------------- 1 | #include "ConfigUnitTest.xcconfig" 2 | #include "ConfigSwiftDebug.xcconfig" 3 | 4 | GCC_GENERATE_TEST_COVERAGE_FILES = NO 5 | GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO 6 | -------------------------------------------------------------------------------- /Configurations/ConfigUnitTestDebug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "ConfigUnitTest.xcconfig" 2 | #include "ConfigSwiftDebug.xcconfig" 3 | -------------------------------------------------------------------------------- /Configurations/ConfigUnitTestRelease.xcconfig: -------------------------------------------------------------------------------- 1 | #include "ConfigUnitTest.xcconfig" 2 | #include "ConfigSwiftRelease.xcconfig" 3 | -------------------------------------------------------------------------------- /Configurations/bsdiff-Debug.xcconfig: -------------------------------------------------------------------------------- 1 | // Copyright © 2019 Sparkle Project. All rights reserved. 2 | 3 | #include "bsdiff-Shared.xcconfig" 4 | -------------------------------------------------------------------------------- /Configurations/bsdiff-Release.xcconfig: -------------------------------------------------------------------------------- 1 | // Copyright © 2019 Sparkle Project. All rights reserved. 2 | 3 | #include "bsdiff-Shared.xcconfig" 4 | 5 | // Disable asserts for performance 6 | GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS) NDEBUG=1 7 | -------------------------------------------------------------------------------- /Configurations/bsdiff-Shared.xcconfig: -------------------------------------------------------------------------------- 1 | // Copyright © 2019 Sparkle Project. All rights reserved. 2 | 3 | // Deployment 4 | SKIP_INSTALL = YES 5 | 6 | // Packaging 7 | EXECUTABLE_PREFIX = lib 8 | PRODUCT_NAME = $(TARGET_NAME) 9 | 10 | // Search Paths 11 | ALWAYS_SEARCH_USER_PATHS = NO 12 | 13 | // Disable Warnings - this is a third-party project, and we'll trust that the maintainers know what they're doing. 14 | WARNING_CFLAGS = $(inherited) -Wno-comma 15 | -------------------------------------------------------------------------------- /Configurations/ed25519-Debug.xcconfig: -------------------------------------------------------------------------------- 1 | // Copyright © 2019 Sparkle Project. All rights reserved. 2 | 3 | #include "ed25519-Shared.xcconfig" 4 | -------------------------------------------------------------------------------- /Configurations/ed25519-Release.xcconfig: -------------------------------------------------------------------------------- 1 | // Copyright © 2019 Sparkle Project. All rights reserved. 2 | 3 | #include "ed25519-Shared.xcconfig" 4 | -------------------------------------------------------------------------------- /Configurations/ed25519-Shared.xcconfig: -------------------------------------------------------------------------------- 1 | // Copyright © 2019 Sparkle Project. All rights reserved. 2 | 3 | // Deployment 4 | SKIP_INSTALL = YES 5 | 6 | // Packaging 7 | EXECUTABLE_PREFIX = lib 8 | PRODUCT_NAME = $(TARGET_NAME) 9 | 10 | // Search Paths 11 | ALWAYS_SEARCH_USER_PATHS = NO 12 | 13 | // Disable Warnings - this is a third-party project, and we'll trust that the maintainers know what they're doing. 14 | WARNING_CFLAGS = $(inherited) -Wno-cast-qual -Wno-conversion -Wno-sign-conversion 15 | 16 | // Disable dead stores analyzer warning 17 | CLANG_ANALYZER_DEADCODE_DEADSTORES = NO 18 | -------------------------------------------------------------------------------- /Configurations/generate_latest_changes.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import os, sys 4 | 5 | # Ignore the first version line starting with # x.y.z.. 6 | # and print everything until the second version line starting with # x.y.z.. 7 | 8 | hit_first_changelog_note = False 9 | with open("CHANGELOG", "r") as changelog_file: 10 | for line in changelog_file: 11 | if line.startswith("#"): 12 | if hit_first_changelog_note: 13 | # We are done with printing changes 14 | break 15 | else: 16 | # We haven't hit an important changelog line yet, so continue 17 | continue 18 | 19 | if not hit_first_changelog_note and len(line.strip()) == 0: 20 | continue 21 | 22 | hit_first_changelog_note = True 23 | sys.stdout.write(line) 24 | -------------------------------------------------------------------------------- /Configurations/link-tools.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # If Carthage is trying to build us, it won't preserve code signing information from our bundled tools properly 4 | # Building Sparkle from source with Carthage is thus not supported 5 | if [ "$CARTHAGE" = "YES" ]; then 6 | echo "Error: Building Sparkle from source using Carthage is not supported. Please visit https://sparkle-project.org/documentation/ for proper Carthage integration." 7 | exit 1 8 | fi 9 | 10 | # Create symlinks to our helper tools in Sparkle framework bundle 11 | # so URLForAuxiliaryExecutable: will pick up the tools. Doing this is supported in the Code Signing in Depth guide. 12 | 13 | FRAMEWORK_PATH="${TARGET_BUILD_DIR}"/"${FULL_PRODUCT_NAME}" 14 | 15 | ln -h -f -s "Versions/Current/""${SPARKLE_RELAUNCH_TOOL_NAME}" "${FRAMEWORK_PATH}"/"${SPARKLE_RELAUNCH_TOOL_NAME}" 16 | ln -h -f -s "Versions/Current/""${SPARKLE_INSTALLER_PROGRESS_TOOL_NAME}".app "${FRAMEWORK_PATH}"/"${SPARKLE_INSTALLER_PROGRESS_TOOL_NAME}".app 17 | -------------------------------------------------------------------------------- /Configurations/update-carthage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import os, sys, json 4 | 5 | if len(sys.argv) < 3: 6 | print("Usage: path-to-carthage-file release-tag") 7 | sys.exit(1) 8 | 9 | carthage_file = sys.argv[1] 10 | release_tag = sys.argv[2] 11 | 12 | with open(carthage_file, "r") as json_file: 13 | data = json.load(json_file) 14 | if release_tag in data: 15 | sys.exit(0) 16 | 17 | with open(carthage_file, "w") as json_file: 18 | data[release_tag] = "https://github.com/sparkle-project/Sparkle/releases/download/" + release_tag + "/Sparkle-" + release_tag + ".tar.xz" 19 | 20 | json.dump(data, json_file) 21 | -------------------------------------------------------------------------------- /Documentation/.gitignore: -------------------------------------------------------------------------------- 1 | html 2 | -------------------------------------------------------------------------------- /Documentation/API_README.markdown: -------------------------------------------------------------------------------- 1 | # Sparkle 2 API Reference 2 | 3 | These are the primary classes and protocols in Sparkle 2 you may be interested in: 4 | 5 | - `SPUStandardUpdaterController` for creating a standard updater (encapsulates a `SPUUpdater` and `SPUStandardUserDriver`) 6 | - `SPUUpdater` for invoking update checks and retrieving updater properties. 7 | - `SPUUpdaterDelegate` for delegation methods to control the behavior of `SPUUpdater`. 8 | - `SPUUserDriver` for making custom user interfaces. 9 | 10 | If you are migrating from Sparkle 1, please refer to `SPUStandardUpdaterController` and `SPUUpdater`. 11 | 12 | Please also visit the [Basic Setup](https://sparkle-project.org/documentation/) guide which shows how to instantiate an updater in a nib or how to create one programmatically. 13 | -------------------------------------------------------------------------------- /Documentation/graph-of-sparkle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Documentation/graph-of-sparkle.png -------------------------------------------------------------------------------- /Downloader/Downloader.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.network.client 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Downloader/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | XPC! 17 | CFBundleShortVersionString 18 | $(MARKETING_VERSION) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSAppTransportSecurity 24 | 25 | NSAllowsArbitraryLoads 26 | 27 | 28 | NSHumanReadableCopyright 29 | Copyright © 2016 Sparkle Project. All rights reserved. 30 | XPCService 31 | 32 | ServiceType 33 | Application 34 | RunLoopType 35 | NSRunLoop 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /Downloader/SPUDownloader.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloader.h 3 | // Downloader 4 | // 5 | // Created by Mayur Pawashe on 4/1/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SPUDownloaderProtocol.h" 11 | 12 | @protocol SPUDownloaderDelegate; 13 | 14 | // This object implements the protocol which we have defined. It provides the actual behavior for the service. It is 'exported' by the service to make it available to the process hosting the service over an NSXPCConnection. 15 | SPU_OBJC_DIRECT_MEMBERS @interface SPUDownloader : NSObject 16 | 17 | // Due to XPC remote object reasons, this delegate is strongly referenced 18 | // Invoke cleanup when done with this instance 19 | - (instancetype)initWithDelegate:(id )delegate; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /Downloader/SPUDownloaderDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloaderDelegate.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 4/1/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class SPUDownloadData; 14 | 15 | @protocol SPUDownloaderDelegate 16 | 17 | // This is only invoked for persistent downloads 18 | - (void)downloaderDidSetDownloadBookmarkData:(NSData *)downloadBookmarkData downloadToken:(NSString *)downloadToken; 19 | 20 | // Under rare cases, this may be called more than once, in which case the current progress should be reset back to 0 21 | // This is only invoked for persistent downloads 22 | - (void)downloaderDidReceiveExpectedContentLength:(int64_t)expectedContentLength; 23 | 24 | // This is only invoked for persistent downloads 25 | - (void)downloaderDidReceiveDataOfLength:(uint64_t)length; 26 | 27 | // downloadData is nil if this is a persisent download, otherwise it's non-nil if it's a temporary download 28 | - (void)downloaderDidFinishWithTemporaryDownloadData:(SPUDownloadData * _Nullable)downloadData; 29 | 30 | - (void)downloaderDidFailWithError:(NSError *)error; 31 | 32 | @end 33 | 34 | NS_ASSUME_NONNULL_END 35 | -------------------------------------------------------------------------------- /Downloader/SPUDownloaderProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloaderProtocol.h 3 | // PersistentDownloader 4 | // 5 | // Created by Mayur Pawashe on 4/1/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | // The protocol that this service will vend as its API. This header file will also need to be visible to the process hosting the service. 14 | @protocol SPUDownloaderProtocol 15 | 16 | - (void)startPersistentDownloadWithRequest:(NSURLRequest *)request bundleIdentifier:(NSString *)bundleIdentifier desiredFilename:(NSString *)desiredFilename; 17 | 18 | - (void)startTemporaryDownloadWithRequest:(NSURLRequest *)request; 19 | 20 | - (void)removeDownloadDirectoryWithDownloadToken:(NSString *)downloadToken bundleIdentifier:(NSString *)bundleIdentifier; 21 | 22 | - (void)cleanup:(void (^)(void))completionHandler; 23 | 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /INSTALL: -------------------------------------------------------------------------------- 1 | For integration and usage, please visit Sparkle's Documentation: 2 | https://sparkle-project.org/documentation/ 3 | 4 | For integrating XPC Services in a Sandboxed Application, please visit: 5 | https://sparkle-project.org/documentation/sandboxing/ 6 | -------------------------------------------------------------------------------- /InstallerConnection/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | XPC! 17 | CFBundleShortVersionString 18 | $(MARKETING_VERSION) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSHumanReadableCopyright 24 | Copyright © 2016 Sparkle Project. All rights reserved. 25 | XPCService 26 | 27 | ServiceType 28 | Application 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /InstallerConnection/SUInstallerCommunicationProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUInstallerCommunicationProtocol.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 7/9/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @protocol SUInstallerCommunicationProtocol 14 | 15 | - (void)handleMessageWithIdentifier:(int32_t)identifier data:(NSData *)data; 16 | 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /InstallerConnection/SUInstallerConnection.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUInstallerConnection.h 3 | // InstallerConnection 4 | // 5 | // Created by Mayur Pawashe on 7/9/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SUInstallerConnectionProtocol.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | // This object implements the protocol which we have defined. It provides the actual behavior for the service. It is 'exported' by the service to make it available to the process hosting the service over an NSXPCConnection. 15 | SPU_OBJC_DIRECT_MEMBERS @interface SUInstallerConnection : NSObject 16 | 17 | // Due to XPC reasons, this delegate is strongly referenced, until it's invalidated 18 | - (instancetype)initWithDelegate:(id)delegate remote:(BOOL)remote; 19 | 20 | - (instancetype)init NS_UNAVAILABLE; 21 | 22 | @end 23 | 24 | NS_ASSUME_NONNULL_END 25 | -------------------------------------------------------------------------------- /InstallerConnection/SUInstallerConnectionProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUInstallerConnectionProtocol.h 3 | // InstallerConnection 4 | // 5 | // Created by Mayur Pawashe on 7/9/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SUInstallerCommunicationProtocol.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @protocol SUInstallerConnectionProtocol 15 | 16 | // This method is declared in SUInstallerCommunicationProtocol too 17 | // the XPC decoder on macOS 10.8 doesn't follow protocols that adopt other protocols, which is why this protocol doesn't adopt SUInstallerCommunicationProtocol 18 | - (void)handleMessageWithIdentifier:(int32_t)identifier data:(NSData *)data; 19 | 20 | - (void)setInvalidationHandler:(void (^)(void))invalidationHandler; 21 | 22 | - (void)setServiceName:(NSString *)serviceName systemDomain:(BOOL)systemDomain; 23 | 24 | - (void)invalidate; 25 | 26 | @end 27 | 28 | NS_ASSUME_NONNULL_END 29 | -------------------------------------------------------------------------------- /InstallerConnection/SUXPCInstallerConnection.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUXPCInstallerConnection.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 7/10/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if INSTALLER_CONNECTION_XPC_SERVICE_EMBEDDED 10 | 11 | #import 12 | #import "SUInstallerConnectionProtocol.h" 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | SPU_OBJC_DIRECT_MEMBERS @interface SUXPCInstallerConnection : NSObject 17 | 18 | // Due to XPC reasons, this delegate is strongly referenced, until it's invalidated 19 | - (instancetype)initWithDelegate:(id)delegate; 20 | 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | 25 | #endif 26 | -------------------------------------------------------------------------------- /InstallerLauncher/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | XPC! 17 | CFBundleShortVersionString 18 | $(MARKETING_VERSION) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSHumanReadableCopyright 24 | Copyright © 2016 Sparkle Project. All rights reserved. 25 | XPCService 26 | 27 | ServiceType 28 | Application 29 | JoinExistingSession 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /InstallerLauncher/SUInstallerLauncher.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUInstallerLauncher.h 3 | // InstallerLauncher 4 | // 5 | // Created by Mayur Pawashe on 4/1/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SUInstallerLauncherProtocol.h" 11 | 12 | // Non-sandboxed XPC service used for launching our installer 13 | // This is necessary for sandboxed applications 14 | @interface SUInstallerLauncher : NSObject 15 | @end 16 | -------------------------------------------------------------------------------- /InstallerLauncher/SUInstallerLauncherProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUInstallerLauncherProtocol.h 3 | // InstallerLauncher 4 | // 5 | // Created by Mayur Pawashe on 4/1/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SUInstallerLauncherStatus.h" 11 | 12 | @protocol SUInstallerLauncherProtocol 13 | 14 | - (void)launchInstallerWithHostBundlePath:(NSString *)hostBundlePath updaterIdentifier:(NSString *)updaterBundleIdentifier authorizationPrompt:(NSString *)authorizationPrompt installationType:(NSString *)installationType allowingDriverInteraction:(BOOL)allowingDriverInteraction completion:(void (^)(SUInstallerLauncherStatus, BOOL))completionHandler; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /InstallerLauncher/SUInstallerLauncherStatus.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUInstallerLauncherStatus.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 7/18/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef NS_ENUM(NSUInteger, SUInstallerLauncherStatus) 12 | { 13 | SUInstallerLauncherSuccess = 0, 14 | SUInstallerLauncherCanceled = 1, 15 | SUInstallerLauncherAuthorizeLater = 3, 16 | SUInstallerLauncherFailure = 4 17 | }; 18 | -------------------------------------------------------------------------------- /InstallerStatus/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | XPC! 17 | CFBundleShortVersionString 18 | $(MARKETING_VERSION) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSHumanReadableCopyright 24 | Copyright © 2016 Sparkle Project. All rights reserved. 25 | XPCService 26 | 27 | ServiceType 28 | Application 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /InstallerStatus/SUInstallerStatus.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUInstallerStatus.h 3 | // InstallerStatus 4 | // 5 | // Created by Mayur Pawashe on 7/10/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SUInstallerStatusProtocol.h" 11 | 12 | // This object implements the protocol which we have defined. It provides the actual behavior for the service. It is 'exported' by the service to make it available to the process hosting the service over an NSXPCConnection. 13 | SPU_OBJC_DIRECT_MEMBERS @interface SUInstallerStatus : NSObject 14 | 15 | - (instancetype)initWithRemote:(BOOL)remote; 16 | 17 | - (instancetype)init NS_UNAVAILABLE; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /InstallerStatus/SUInstallerStatusProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUInstallerStatusProtocol.h 3 | // InstallerStatus 4 | // 5 | // Created by Mayur Pawashe on 7/10/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SUStatusInfoProtocol.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | // The protocol that this service will vend as its API. This header file will also need to be visible to the process hosting the service. 15 | @protocol SUInstallerStatusProtocol 16 | 17 | // Even though this is declared in SUStatusInfoProtocol, we should declare it here because macOS 10.8 doesn't traverse adopted protocols, 18 | // which is why this protocol doesn't adopt SUStatusInfoProtocol 19 | - (void)probeStatusInfoWithReply:(void (^)(NSData * _Nullable installationInfoData))reply; 20 | 21 | // Even though this is declared in SUStatusInfoProtocol, we should declare it here because macOS 10.8 doesn't traverse adopted protocols, 22 | // which is why this protocol doesn't adopt SUStatusInfoProtocol 23 | - (void)probeStatusConnectivityWithReply:(void (^)(void))reply; 24 | 25 | - (void)setInvalidationHandler:(void (^)(void))invalidationHandler; 26 | 27 | - (void)setServiceName:(NSString *)serviceName; 28 | 29 | - (void)invalidate; 30 | 31 | @end 32 | 33 | NS_ASSUME_NONNULL_END 34 | -------------------------------------------------------------------------------- /InstallerStatus/SUXPCInstallerStatus.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUXPCInstallerStatus.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 7/10/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if INSTALLER_STATUS_XPC_SERVICE_EMBEDDED 10 | 11 | #import 12 | #import "SUInstallerStatusProtocol.h" 13 | 14 | @interface SUXPCInstallerStatus : NSObject 15 | 16 | @end 17 | 18 | #endif 19 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.3 2 | import PackageDescription 3 | 4 | // Version is technically not required here, SPM doesn't check 5 | let version = "2.7.0" 6 | // Tag is required to point towards the right asset. SPM requires the tag to follow semantic versioning to be able to resolve it. 7 | let tag = "2.7.0" 8 | let checksum = "a1fb05c4fd6b73bc351f4d326e6171473b7a99b7f2bfa8f5f69f7281f66dc387" 9 | let url = "https://github.com/sparkle-project/Sparkle/releases/download/\(tag)/Sparkle-for-Swift-Package-Manager.zip" 10 | 11 | let package = Package( 12 | name: "Sparkle", 13 | platforms: [.macOS(.v10_13)], // leaving "10.13" as a breadcrumb for searching 14 | products: [ 15 | .library( 16 | name: "Sparkle", 17 | targets: ["Sparkle"]) 18 | ], 19 | targets: [ 20 | .binaryTarget( 21 | name: "Sparkle", 22 | url: url, 23 | checksum: checksum 24 | ) 25 | ] 26 | ) 27 | -------------------------------------------------------------------------------- /Resources/Images.xcassets/AppIcon.appiconset/icon_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Resources/Images.xcassets/AppIcon.appiconset/icon_128x128.png -------------------------------------------------------------------------------- /Resources/Images.xcassets/AppIcon.appiconset/icon_128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Resources/Images.xcassets/AppIcon.appiconset/icon_128x128@2x.png -------------------------------------------------------------------------------- /Resources/Images.xcassets/AppIcon.appiconset/icon_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Resources/Images.xcassets/AppIcon.appiconset/icon_16x16.png -------------------------------------------------------------------------------- /Resources/Images.xcassets/AppIcon.appiconset/icon_16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Resources/Images.xcassets/AppIcon.appiconset/icon_16x16@2x.png -------------------------------------------------------------------------------- /Resources/Images.xcassets/AppIcon.appiconset/icon_256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Resources/Images.xcassets/AppIcon.appiconset/icon_256x256.png -------------------------------------------------------------------------------- /Resources/Images.xcassets/AppIcon.appiconset/icon_256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Resources/Images.xcassets/AppIcon.appiconset/icon_256x256@2x.png -------------------------------------------------------------------------------- /Resources/Images.xcassets/AppIcon.appiconset/icon_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Resources/Images.xcassets/AppIcon.appiconset/icon_32x32.png -------------------------------------------------------------------------------- /Resources/Images.xcassets/AppIcon.appiconset/icon_32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Resources/Images.xcassets/AppIcon.appiconset/icon_32x32@2x.png -------------------------------------------------------------------------------- /Resources/Images.xcassets/AppIcon.appiconset/icon_512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Resources/Images.xcassets/AppIcon.appiconset/icon_512x512.png -------------------------------------------------------------------------------- /Resources/Images.xcassets/AppIcon.appiconset/icon_512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Resources/Images.xcassets/AppIcon.appiconset/icon_512x512@2x.png -------------------------------------------------------------------------------- /Resources/ReleaseNotesColorStyle.css: -------------------------------------------------------------------------------- 1 | @media (prefers-color-scheme: dark) { 2 | html { 3 | color-scheme: dark; 4 | color: white; 5 | background: transparent; 6 | } 7 | :link { 8 | color: #419CFF; 9 | } 10 | :link:active { 11 | color: #FF1919; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Resources/Screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Resources/Screenshot.png -------------------------------------------------------------------------------- /Resources/Screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Resources/Screenshot2.png -------------------------------------------------------------------------------- /Resources/Screenshot3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Resources/Screenshot3.png -------------------------------------------------------------------------------- /Resources/Sparkle-Icon.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Resources/Sparkle-Icon.sketch -------------------------------------------------------------------------------- /Sparkle.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Sparkle.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sparkle.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "pins" : [ 3 | { 4 | "identity" : "swift-argument-parser", 5 | "kind" : "remoteSourceControl", 6 | "location" : "https://github.com/apple/swift-argument-parser.git", 7 | "state" : { 8 | "revision" : "83b23d940471b313427da226196661856f6ba3e0", 9 | "version" : "0.4.4" 10 | } 11 | } 12 | ], 13 | "version" : 2 14 | } 15 | -------------------------------------------------------------------------------- /Sparkle/AppKitPrevention.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppKitPrevention.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 1/17/17. 6 | // Copyright © 2017 Sparkle Project. All rights reserved. 7 | // 8 | 9 | // #include (not #import) this header to prevent AppKit from being imported 10 | // Note this should be your LAST #include in your implementation file 11 | 12 | // If this error is triggered, you can have Xcode indicate to you which source file including this header caused the issue 13 | 14 | #ifdef _APPKITDEFINES_H 15 | #error This is a core or daemon-safe module and should NOT import AppKit 16 | #endif 17 | -------------------------------------------------------------------------------- /Sparkle/Autoupdate/TerminationListener.h: -------------------------------------------------------------------------------- 1 | // 2 | // TerminationListener.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/7/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface TerminationListener : NSObject 14 | 15 | - (instancetype)initWithProcessIdentifier:(NSNumber * _Nullable)processIdentifier; 16 | 17 | @property (nonatomic, readonly) BOOL terminated; 18 | 19 | // If the process identifier provided was nil, then the completion block will invoke immediately with a YES success 20 | - (void)startListeningWithCompletion:(void (^)(BOOL success))completionBlock; 21 | 22 | @end 23 | 24 | NS_ASSUME_NONNULL_END 25 | -------------------------------------------------------------------------------- /Sparkle/InstallerProgress/InstallerProgressAppController.h: -------------------------------------------------------------------------------- 1 | // 2 | // InstallerProgressAppController.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 4/10/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @protocol InstallerProgressDelegate; 14 | 15 | SPU_OBJC_DIRECT_MEMBERS @interface InstallerProgressAppController : NSObject 16 | 17 | - (instancetype)initWithApplication:(NSApplication *)application arguments:(NSArray *)arguments delegate:(id)delegate; 18 | 19 | - (void)run; 20 | 21 | - (void)cleanupAndExitWithStatus:(int)status error:(NSError * _Nullable)error __attribute__((noreturn)); 22 | 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | -------------------------------------------------------------------------------- /Sparkle/InstallerProgress/InstallerProgressDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // InstallerProgressDelegate.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 4/10/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class SUHost; 14 | 15 | @protocol InstallerProgressDelegate 16 | 17 | - (void)loadLocalizationStringsFromHost:(SUHost *)host; 18 | - (void)installerProgressShouldDisplayWithHost:(SUHost *)host; 19 | - (void)installerProgressShouldStop; 20 | 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | -------------------------------------------------------------------------------- /Sparkle/InstallerProgress/SPUInstallerAgentProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUInstallerAgentProtocol.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 7/17/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @protocol SPUInstallerAgentProtocol 14 | 15 | - (void)registerApplicationBundlePath:(NSString *)applicationBundlePath reply:(void (^)(BOOL))reply; 16 | 17 | - (void)registerInstallationInfoData:(NSData *)installationInfoData; 18 | 19 | - (void)listenForTerminationWithCompletion:(void (^)(void))completionHandler; 20 | 21 | - (void)sendTerminationSignal; 22 | 23 | - (void)showProgress; 24 | 25 | - (void)stopProgress; 26 | 27 | - (void)relaunchApplication; 28 | 29 | @end 30 | 31 | NS_ASSUME_NONNULL_END 32 | -------------------------------------------------------------------------------- /Sparkle/InstallerProgress/SUInstallerAgentInitiationProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUInstallerAgentInitiationProtocol.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 7/17/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol SUInstallerAgentInitiationProtocol 12 | 13 | - (void)connectionDidInitiateWithReply:(void (^)(void))acknowledgement; 14 | 15 | - (void)connectionWillInvalidateWithError:(NSError *)error; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Sparkle/InstallerProgress/ShowInstallerProgress.h: -------------------------------------------------------------------------------- 1 | // 2 | // ShowInstallerProgress.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 4/10/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "InstallerProgressDelegate.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface ShowInstallerProgress : NSObject 15 | 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /Sparkle/SPUAppcastItemState.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUAppcastItemState.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 5/31/21. 6 | // Copyright © 2021 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | // Appcast Item state that contains properties that depends on a host 14 | SPU_OBJC_DIRECT_MEMBERS @interface SPUAppcastItemState : NSObject 15 | 16 | - (instancetype)init NS_UNAVAILABLE; 17 | 18 | - (instancetype)initWithMajorUpgrade:(BOOL)majorUpgrade criticalUpdate:(BOOL)criticalUpdate informationalUpdate:(BOOL)informationalUpdate minimumOperatingSystemVersionIsOK:(BOOL)minimumOperatingSystemVersionIsOK maximumOperatingSystemVersionIsOK:(BOOL)maximumOperatingSystemVersionIsOK; 19 | 20 | @property (nonatomic, readonly) BOOL majorUpgrade; 21 | @property (nonatomic, readonly) BOOL criticalUpdate; 22 | @property (nonatomic, readonly) BOOL informationalUpdate; 23 | @property (nonatomic, readonly) BOOL minimumOperatingSystemVersionIsOK; 24 | @property (nonatomic, readonly) BOOL maximumOperatingSystemVersionIsOK; 25 | 26 | @end 27 | 28 | NS_ASSUME_NONNULL_END 29 | -------------------------------------------------------------------------------- /Sparkle/SPUAppcastItemStateResolver+Private.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUAppcastItemStateResolver+Private.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 6/20/21. 6 | // Copyright © 2021 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SPUAppcastItemStateResolver_Private_h 10 | #define SPUAppcastItemStateResolver_Private_h 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface SPUAppcastItemStateResolver () 15 | 16 | - (SPUAppcastItemState *)resolveStateWithInformationalUpdateVersions:(NSSet * _Nullable)informationalUpdateVersions minimumOperatingSystemVersion:(NSString * _Nullable)minimumOperatingSystemVersion maximumOperatingSystemVersion:(NSString * _Nullable)maximumOperatingSystemVersion minimumAutoupdateVersion:(NSString * _Nullable)minimumAutoupdateVersion criticalUpdateDictionary:(NSDictionary * _Nullable)criticalUpdateDictionary; 17 | 18 | + (BOOL)isMinimumAutoupdateVersionOK:(NSString * _Nullable)minimumAutoupdateVersion hostVersion:(NSString *)hostVersion versionComparator:(id)versionComparator; 19 | 20 | @end 21 | 22 | NS_ASSUME_NONNULL_END 23 | 24 | #endif /* SPUAppcastItemStateResolver_Private_h */ 25 | -------------------------------------------------------------------------------- /Sparkle/SPUAppcastItemStateResolver.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUAppcastItemStateResolver.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 5/31/21. 6 | // Copyright © 2021 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #if defined(BUILDING_SPARKLE_SOURCES_EXTERNALLY) 12 | // Ignore incorrect warning 13 | #pragma clang diagnostic push 14 | #pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" 15 | #import "SUExport.h" 16 | #pragma clang diagnostic pop 17 | #else 18 | #import 19 | #endif 20 | 21 | NS_ASSUME_NONNULL_BEGIN 22 | 23 | @class SUStandardVersionComparator, SPUAppcastItemState; 24 | @protocol SUVersionComparison; 25 | 26 | /** 27 | Private exposed class used to resolve Appcast Item properties that rely on external factors such as a host. 28 | This resolver is used for constructing appcast items. 29 | */ 30 | SU_EXPORT @interface SPUAppcastItemStateResolver : NSObject 31 | 32 | - (instancetype)init NS_UNAVAILABLE; 33 | 34 | - (instancetype)initWithHostVersion:(NSString *)hostVersion applicationVersionComparator:(id)applicationVersionComparator standardVersionComparator:(SUStandardVersionComparator *)standardVersionComparator; 35 | 36 | @end 37 | 38 | NS_ASSUME_NONNULL_END 39 | -------------------------------------------------------------------------------- /Sparkle/SPUAutomaticUpdateDriver.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUAutomaticUpdateDriver.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/18/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SPUUpdateDriver.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @class SUHost; 15 | @protocol SPUUpdaterDelegate, SPUUserDriver; 16 | 17 | SPU_OBJC_DIRECT_MEMBERS @interface SPUAutomaticUpdateDriver : NSObject 18 | 19 | - (instancetype)initWithHost:(SUHost *)host applicationBundle:(NSBundle *)applicationBundle updater:(id)updater userDriver:(id )userDriver updaterDelegate:(nullable id )updaterDelegate; 20 | 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | -------------------------------------------------------------------------------- /Sparkle/SPUDownloadDataPrivate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloadDataPrivate.h 3 | // SPUDownloadDataPrivate 4 | // 5 | // Created by Mayur Pawashe on 8/13/21. 6 | // Copyright © 2021 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface SPUDownloadData (Private) 14 | 15 | - (instancetype)initWithData:(NSData *)data URL:(NSURL *)URL textEncodingName:(NSString * _Nullable)textEncodingName MIMEType:(NSString * _Nullable)MIMEType; 16 | 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /Sparkle/SPUDownloadedUpdate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloadedUpdate.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 1/8/17. 6 | // Copyright © 2017 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SPUResumableUpdate.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | SPU_OBJC_DIRECT_MEMBERS @interface SPUDownloadedUpdate : NSObject 15 | 16 | - (instancetype)initWithAppcastItem:(SUAppcastItem *)updateItem secondaryAppcastItem:(SUAppcastItem * _Nullable)secondaryItem downloadBookmarkData:(NSData *)downloadBookmarkData downloadToken:(NSString *)downloadToken; 17 | 18 | @property (nonatomic, readonly) NSData *downloadBookmarkData; 19 | @property (nonatomic, readonly) NSString *downloadToken; 20 | 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | -------------------------------------------------------------------------------- /Sparkle/SPUDownloadedUpdate.m: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloadedUpdate.m 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 1/8/17. 6 | // Copyright © 2017 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import "SPUDownloadedUpdate.h" 10 | 11 | 12 | #include "AppKitPrevention.h" 13 | 14 | @implementation SPUDownloadedUpdate 15 | 16 | // If we ever enable auto-synthesize in the future, we'll still need this synthesize 17 | // because the property is declared in a protocol 18 | @synthesize updateItem = _updateItem; 19 | @synthesize secondaryUpdateItem = _secondaryUpdateItem; 20 | 21 | @synthesize downloadBookmarkData = _downloadBookmarkData; 22 | @synthesize downloadToken = _downloadToken; 23 | 24 | - (instancetype)initWithAppcastItem:(SUAppcastItem *)updateItem secondaryAppcastItem:(SUAppcastItem * _Nullable)secondaryUpdateItem downloadBookmarkData:(NSData *)downloadBookmarkData downloadToken:(NSString *)downloadToken 25 | { 26 | self = [super init]; 27 | if (self != nil) { 28 | _updateItem = updateItem; 29 | _secondaryUpdateItem = secondaryUpdateItem; 30 | _downloadBookmarkData = downloadBookmarkData; 31 | _downloadToken = [downloadToken copy]; 32 | } 33 | return self; 34 | } 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /Sparkle/SPUGentleUserDriverReminders.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUGentleUserDriverReminders.h 3 | // Sparkle 4 | // 5 | // Copyright © 2022 Sparkle Project. All rights reserved. 6 | // 7 | 8 | #ifndef SPUGentleUserDriverReminders_h 9 | #define SPUGentleUserDriverReminders_h 10 | 11 | /** 12 | A private protocol for user drivers implementing gentle scheduled reminders 13 | */ 14 | @protocol SPUGentleUserDriverReminders 15 | 16 | - (void)logGentleScheduledUpdateReminderWarningIfNeeded; 17 | 18 | - (void)resetTimeSinceOpportuneUpdateNotice; 19 | 20 | @end 21 | 22 | #endif /* SPUGentleUserDriverReminders_h */ 23 | -------------------------------------------------------------------------------- /Sparkle/SPUInformationalUpdate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUInformationalUpdate.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 1/8/17. 6 | // Copyright © 2017 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SPUResumableUpdate.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | SPU_OBJC_DIRECT_MEMBERS @interface SPUInformationalUpdate : NSObject 15 | 16 | - (instancetype)initWithAppcastItem:(SUAppcastItem *)updateItem secondaryAppcastItem:(SUAppcastItem * _Nullable)secondaryUpdateItem; 17 | 18 | @end 19 | 20 | NS_ASSUME_NONNULL_END 21 | -------------------------------------------------------------------------------- /Sparkle/SPUInformationalUpdate.m: -------------------------------------------------------------------------------- 1 | // 2 | // SPUInformationalUpdate.m 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 1/8/17. 6 | // Copyright © 2017 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import "SPUInformationalUpdate.h" 10 | 11 | 12 | #include "AppKitPrevention.h" 13 | 14 | @implementation SPUInformationalUpdate 15 | 16 | // If we ever enable auto-synthesize in the future, we'll still need this synthesize 17 | // because the property is declared in a protocol 18 | @synthesize updateItem = _updateItem; 19 | @synthesize secondaryUpdateItem = _secondaryUpdateItem; 20 | 21 | - (instancetype)initWithAppcastItem:(SUAppcastItem *)updateItem secondaryAppcastItem:(SUAppcastItem * _Nullable)secondaryUpdateItem 22 | { 23 | self = [super init]; 24 | if (self != nil) { 25 | _updateItem = updateItem; 26 | _secondaryUpdateItem = secondaryUpdateItem; 27 | } 28 | return self; 29 | } 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /Sparkle/SPUInstallationType.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUInstallationType.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 7/24/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SPUInstallationType_h 10 | #define SPUInstallationType_h 11 | 12 | #define SPUInstallationTypeApplication @"application" // the default installation type for ordinary application updates 13 | #define SPUInstallationTypeGuidedPackage @"package" // the preferred installation type for package installations 14 | #define SPUInstallationTypeInteractivePackage @"interactive-package" // the deprecated installation type; use guided package instead 15 | 16 | #define SPUInstallationTypesArray (@[SPUInstallationTypeApplication, SPUInstallationTypeGuidedPackage, SPUInstallationTypeInteractivePackage]) 17 | #define SPUValidInstallationType(x) ((x != nil) && [SPUInstallationTypesArray containsObject:(NSString * _Nonnull)x]) 18 | 19 | #endif /* SPUInstallationType_h */ 20 | -------------------------------------------------------------------------------- /Sparkle/SPUNoUpdateFoundInfo.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUNoUpdateFoundInfo.h 3 | // Sparkle 4 | // 5 | // Created on 2/18/23. 6 | // Copyright © 2023 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "SUVersionDisplayProtocol.h" 12 | #import "SUErrors.h" 13 | 14 | @class SUAppcastItem; 15 | @class SUHost; 16 | 17 | NS_ASSUME_NONNULL_BEGIN 18 | 19 | NSString *SPUNoUpdateFoundRecoverySuggestion(SPUNoUpdateFoundReason reason, SUAppcastItem * _Nullable latestAppcastItem, SUHost *host, id versionDisplayer, NSBundle * _Nullable sparkleBundle); 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /Sparkle/SPUProbeInstallStatus.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUProbeInstallStatus.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/20/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class SPUInstallationInfo; 14 | 15 | SPU_OBJC_DIRECT_MEMBERS @interface SPUProbeInstallStatus : NSObject 16 | 17 | + (void)probeInstallerInProgressForHostBundleIdentifier:(NSString *)hostBundleIdentifier completion:(void (^)(BOOL))completionHandler; 18 | 19 | // completionHandler may not be sent on main queue 20 | // additionally, it may be possible that the installer is in progress but we get a nil installation info back 21 | + (void)probeInstallerUpdateItemForHostBundleIdentifier:(NSString *)hostBundleIdentifier completion:(void (^)(SPUInstallationInfo * _Nullable))completionHandler; 22 | 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | -------------------------------------------------------------------------------- /Sparkle/SPUProbingUpdateDriver.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUProbingUpdateDriver.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/18/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SPUUpdateDriver.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @class SUHost; 15 | @protocol SPUUpdaterDelegate; 16 | 17 | SPU_OBJC_DIRECT_MEMBERS @interface SPUProbingUpdateDriver : NSObject 18 | 19 | - (instancetype)initWithHost:(SUHost *)host updater:(id)updater updaterDelegate:(nullable id )updaterDelegate; 20 | 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | -------------------------------------------------------------------------------- /Sparkle/SPUResumableUpdate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUResumableUpdate.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 7/18/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class SUAppcastItem; 14 | 15 | @protocol SPUResumableUpdate 16 | 17 | @property (nonatomic, readonly) SUAppcastItem *updateItem; 18 | @property (nonatomic, readonly, nullable) SUAppcastItem *secondaryUpdateItem; 19 | 20 | @end 21 | 22 | NS_ASSUME_NONNULL_END 23 | -------------------------------------------------------------------------------- /Sparkle/SPUScheduledUpdateDriver.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUScheduledUpdateDriver.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/15/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SPUUpdateDriver.h" 11 | #import "SPUUIBasedUpdateDriver.h" 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @class SUHost; 16 | @protocol SPUUserDriver, SPUUpdaterDelegate; 17 | 18 | SPU_OBJC_DIRECT_MEMBERS @interface SPUScheduledUpdateDriver : NSObject 19 | 20 | - (instancetype)initWithHost:(SUHost *)host applicationBundle:(NSBundle *)applicationBundle updater:(id)updater userDriver:(id )userDriver updaterDelegate:(nullable id )updaterDelegate; 21 | 22 | @end 23 | 24 | NS_ASSUME_NONNULL_END 25 | -------------------------------------------------------------------------------- /Sparkle/SPUSecureCoding.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUSecureCoding.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/24/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | // If we are using XPC without using XPC Services, our custom classes will not be (de)serialized automatically, 12 | // hence needing functions to archive/unarchive NSSecureCoding objects. 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | NSData * _Nullable SPUArchiveRootObjectSecurely(id rootObject); 17 | 18 | id _Nullable SPUUnarchiveRootObjectSecurely(NSData *data, Class klass); 19 | 20 | NS_ASSUME_NONNULL_END 21 | -------------------------------------------------------------------------------- /Sparkle/SPUSecureCoding.m: -------------------------------------------------------------------------------- 1 | // 2 | // SPUSecureCoding.m 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/24/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import "SPUSecureCoding.h" 10 | #import "SULog.h" 11 | 12 | 13 | #include "AppKitPrevention.h" 14 | 15 | static NSString *SURootObjectArchiveKey = @"SURootObjectArchive"; 16 | 17 | NSData * _Nullable SPUArchiveRootObjectSecurely(id rootObject) 18 | { 19 | NSError *error = nil; 20 | NSData *data = [NSKeyedArchiver archivedDataWithRootObject:rootObject requiringSecureCoding:YES error:&error]; 21 | if (data == nil) { 22 | SULog(SULogLevelError, @"Error while securely archiving object: %@", error); 23 | } 24 | return data; 25 | } 26 | 27 | id _Nullable SPUUnarchiveRootObjectSecurely(NSData *data, Class klass) 28 | { 29 | NSError *error = nil; 30 | id rootObject = [NSKeyedUnarchiver unarchivedObjectOfClass:klass fromData:data error:&error]; 31 | if (rootObject == nil) { 32 | SULog(SULogLevelError, @"Error while securely unarchiving object: %@", error); 33 | } 34 | return rootObject; 35 | } 36 | -------------------------------------------------------------------------------- /Sparkle/SPUStandardUserDriver+Private.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUStandardUserDriver+Private.h 3 | // Sparkle 4 | // 5 | // Copyright © 2022 Sparkle Project. All rights reserved. 6 | // 7 | 8 | #ifndef SPUStandardUserDriver_Private_h 9 | #define SPUStandardUserDriver_Private_h 10 | 11 | #if defined(BUILDING_SPARKLE_SOURCES_EXTERNALLY) 12 | // Ignore incorrect warning 13 | #pragma clang diagnostic push 14 | #pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" 15 | #import "SPUStandardUserDriver.h" 16 | #import "SUExport.h" 17 | #pragma clang diagnostic pop 18 | #else 19 | #import 20 | #import 21 | #endif 22 | 23 | @class NSWindowController; 24 | 25 | NS_ASSUME_NONNULL_BEGIN 26 | 27 | SU_EXPORT @interface SPUStandardUserDriver (Private) 28 | 29 | /** 30 | Private API for accessing the active update alert's window controller. 31 | This is the window controller that shows the update's release notes and install choices. 32 | This can be accessed in -[SPUStandardUserDriverDelegate standardUserDriverWillHandleShowingUpdate:forUpdate:state:] 33 | */ 34 | @property (nonatomic, readonly, nullable) NSWindowController *activeUpdateAlert; 35 | 36 | @end 37 | 38 | NS_ASSUME_NONNULL_END 39 | 40 | #endif /* SPUStandardUserDriver_Private_h */ 41 | -------------------------------------------------------------------------------- /Sparkle/SPUStandardVersionDisplay.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUStandardVersionDisplay.h 3 | // Sparkle 4 | // 5 | // Created on 2/18/23. 6 | // Copyright © 2023 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SUVersionDisplayProtocol.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | SPU_OBJC_DIRECT_MEMBERS @interface SPUStandardVersionDisplay : NSObject 15 | 16 | + (instancetype)standardVersionDisplay; 17 | 18 | @end 19 | 20 | NS_ASSUME_NONNULL_END 21 | -------------------------------------------------------------------------------- /Sparkle/SPUUpdateCheck.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUUpdateCheck.h 3 | // SPUUpdateCheck 4 | // 5 | // Created by Mayur Pawashe on 8/28/21. 6 | // Copyright © 2021 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SPUUpdateCheck_h 10 | #define SPUUpdateCheck_h 11 | 12 | /** 13 | Describes the type of update check being performed. 14 | 15 | Each update check corresponds to an update check method on `SPUUpdater`. 16 | */ 17 | typedef NS_ENUM(NSInteger, SPUUpdateCheck) 18 | { 19 | /** 20 | The user-initiated update check corresponding to `-[SPUUpdater checkForUpdates]`. 21 | */ 22 | SPUUpdateCheckUpdates = 0, 23 | /** 24 | The background scheduled update check corresponding to `-[SPUUpdater checkForUpdatesInBackground]`. 25 | */ 26 | SPUUpdateCheckUpdatesInBackground = 1, 27 | /** 28 | The informational probe update check corresponding to `-[SPUUpdater checkForUpdateInformation]`. 29 | */ 30 | SPUUpdateCheckUpdateInformation = 2 31 | }; 32 | 33 | #endif /* SPUUpdateCheck_h */ 34 | -------------------------------------------------------------------------------- /Sparkle/SPUUpdatePermissionRequest.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUUpdatePermissionRequest.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 8/14/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #if defined(BUILDING_SPARKLE_SOURCES_EXTERNALLY) 12 | // Ignore incorrect warning 13 | #pragma clang diagnostic push 14 | #pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" 15 | #import "SUExport.h" 16 | #pragma clang diagnostic pop 17 | #else 18 | #import 19 | #endif 20 | 21 | NS_ASSUME_NONNULL_BEGIN 22 | 23 | /** 24 | This class represents information needed to make a permission request for checking updates. 25 | */ 26 | SU_EXPORT @interface SPUUpdatePermissionRequest : NSObject 27 | 28 | /** 29 | Initializes a new update permission request instance. 30 | 31 | @param systemProfile The system profile information. 32 | */ 33 | - (instancetype)initWithSystemProfile:(NSArray *> *)systemProfile; 34 | 35 | /** 36 | A read-only property for the user's system profile. 37 | */ 38 | @property (nonatomic, readonly) NSArray *> *systemProfile; 39 | 40 | @end 41 | 42 | NS_ASSUME_NONNULL_END 43 | -------------------------------------------------------------------------------- /Sparkle/SPUUpdaterCycle.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUUpdaterCycle.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 6/11/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @protocol SPUUpdaterCycleDelegate 14 | 15 | - (void)resetUpdateCycle; 16 | 17 | @end 18 | 19 | // This notifies the updater for (re-)starting and canceling update cycles 20 | // This class is used so that an updater instance isn't kept alive by a pending update cycle 21 | SPU_OBJC_DIRECT_MEMBERS @interface SPUUpdaterCycle : NSObject 22 | 23 | // This delegate is weakly referenced 24 | - (instancetype)initWithDelegate:(id)delegate; 25 | 26 | - (void)resetUpdateCycleAfterDelay; 27 | 28 | - (void)cancelNextUpdateCycle; 29 | 30 | @end 31 | 32 | NS_ASSUME_NONNULL_END 33 | -------------------------------------------------------------------------------- /Sparkle/SPUUpdaterCycle.m: -------------------------------------------------------------------------------- 1 | // 2 | // SPUUpdaterCycle.m 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 6/11/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import "SPUUpdaterCycle.h" 10 | 11 | 12 | #include "AppKitPrevention.h" 13 | 14 | @implementation SPUUpdaterCycle 15 | { 16 | __weak id _delegate; 17 | } 18 | 19 | - (instancetype)initWithDelegate:(id)delegate 20 | { 21 | self = [super init]; 22 | if (self != nil) { 23 | _delegate = delegate; 24 | } 25 | return self; 26 | } 27 | 28 | - (void)resetUpdateCycle 29 | { 30 | [_delegate resetUpdateCycle]; 31 | } 32 | 33 | - (void)resetUpdateCycleAfterDelay 34 | { 35 | [self performSelector:@selector(resetUpdateCycle) withObject:nil afterDelay:1]; 36 | } 37 | 38 | - (void)cancelNextUpdateCycle 39 | { 40 | [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(resetUpdateCycle) object:nil]; 41 | } 42 | 43 | @end 44 | -------------------------------------------------------------------------------- /Sparkle/SPUUpdaterTimer.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUUpdaterTimer.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 8/12/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @protocol SPUUpdaterTimerDelegate 14 | 15 | - (void)updaterTimerDidFire; 16 | 17 | @end 18 | 19 | // This notifies the updater for scheduled update checks 20 | // This class is used so that an updater instance isn't kept alive by a scheduled update check 21 | SPU_OBJC_DIRECT_MEMBERS @interface SPUUpdaterTimer : NSObject 22 | 23 | - (instancetype)initWithDelegate:(id)delegate; 24 | 25 | - (void)startAndFireAfterDelay:(NSTimeInterval)delay; 26 | 27 | - (void)invalidate; 28 | 29 | @end 30 | 31 | NS_ASSUME_NONNULL_END 32 | -------------------------------------------------------------------------------- /Sparkle/SPUUserAgent+Private.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUUserAgent+Private.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 11/12/21. 6 | // Copyright © 2021 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #if defined(BUILDING_SPARKLE_SOURCES_EXTERNALLY) 12 | // Ignore incorrect warning 13 | #pragma clang diagnostic push 14 | #pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" 15 | #import "SUExport.h" 16 | #pragma clang diagnostic pop 17 | #else 18 | #import 19 | #endif 20 | 21 | NS_ASSUME_NONNULL_BEGIN 22 | 23 | @class SUHost; 24 | 25 | SU_EXPORT NSString *SPUMakeUserAgentWithHost(SUHost *responsibleHost, NSString * _Nullable displayNameSuffix); 26 | 27 | SU_EXPORT NSString *SPUMakeUserAgentWithBundle(NSBundle *responsibleBundle, NSString * _Nullable displayNameSuffix); 28 | 29 | NS_ASSUME_NONNULL_END 30 | -------------------------------------------------------------------------------- /Sparkle/SPUUserInitiatedUpdateDriver.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUUserInitiatedUpdateDriver.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/18/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SPUUpdateDriver.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @class SUHost; 15 | @protocol SPUUpdaterDelegate, SPUUserDriver; 16 | 17 | SPU_OBJC_DIRECT_MEMBERS @interface SPUUserInitiatedUpdateDriver : NSObject 18 | 19 | - (instancetype)initWithHost:(SUHost *)host applicationBundle:(NSBundle *)applicationBundle updater:(id)updater userDriver:(id )userDriver updaterDelegate:(nullable id )updaterDelegate; 20 | 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | -------------------------------------------------------------------------------- /Sparkle/SPUUserUpdateState+Private.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUUserUpdateState+Private.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 5/9/21. 6 | // Copyright © 2021 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SPUUserUpdateState_Private_h 10 | #define SPUUserUpdateState_Private_h 11 | 12 | #import "SPUUserUpdateState.h" 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | @interface SPUUserUpdateState (Private) 17 | 18 | - (instancetype)initWithStage:(SPUUserUpdateStage)stage userInitiated:(BOOL)userInitiated; 19 | 20 | @end 21 | 22 | NS_ASSUME_NONNULL_END 23 | 24 | #endif /* SPUUserUpdateState_Private_h */ 25 | -------------------------------------------------------------------------------- /Sparkle/SPUVerifierInformation.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUVerifierInformation.h 3 | // Autoupdate 4 | // 5 | // Copyright © 2023 Sparkle Project. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | SPU_OBJC_DIRECT_MEMBERS @interface SPUVerifierInformation : NSObject 13 | 14 | - (instancetype)initWithExpectedVersion:(NSString * _Nullable)expectedVersion expectedContentLength:(uint64_t)expectedContentLength; 15 | 16 | @property (nonatomic, readonly, copy, nullable) NSString *expectedVersion; 17 | @property (nonatomic, readonly) uint64_t expectedContentLength; 18 | 19 | @property (nonatomic, copy, nullable) NSString *actualVersion; 20 | @property (nonatomic) uint64_t actualContentLength; 21 | 22 | @end 23 | 24 | NS_ASSUME_NONNULL_END 25 | -------------------------------------------------------------------------------- /Sparkle/SPUVerifierInformation.m: -------------------------------------------------------------------------------- 1 | // 2 | // SPUVerifierInformation.m 3 | // Autoupdate 4 | // 5 | // Copyright © 2023 Sparkle Project. All rights reserved. 6 | // 7 | 8 | #import "SPUVerifierInformation.h" 9 | 10 | @implementation SPUVerifierInformation 11 | 12 | @synthesize expectedVersion = _expectedVersion; 13 | @synthesize expectedContentLength = _expectedContentLength; 14 | @synthesize actualVersion = _actualVersion; 15 | @synthesize actualContentLength = _actualContentLength; 16 | 17 | - (instancetype)initWithExpectedVersion:(NSString *)expectedVersion expectedContentLength:(uint64_t)expectedContentLength 18 | { 19 | self = [super init]; 20 | if (self != nil) { 21 | _expectedVersion = [expectedVersion copy]; 22 | _expectedContentLength = expectedContentLength; 23 | } 24 | return self; 25 | } 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /Sparkle/SPUXPCServiceInfo.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUXPCServiceInfo.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 4/17/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | BOOL SPUXPCServiceIsEnabled(NSString *enabledKey); 14 | 15 | NS_ASSUME_NONNULL_END 16 | -------------------------------------------------------------------------------- /Sparkle/SPUXPCServiceInfo.m: -------------------------------------------------------------------------------- 1 | // 2 | // SUXPCServiceInfo.m 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 4/17/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import "SPUXPCServiceInfo.h" 10 | #import "SUErrors.h" 11 | #import "SUConstants.h" 12 | #import "SUHost.h" 13 | 14 | #include "AppKitPrevention.h" 15 | 16 | BOOL SPUXPCServiceIsEnabled(NSString *enabledKey) 17 | { 18 | NSBundle *mainBundle = [NSBundle mainBundle]; 19 | SUHost *mainBundleHost = [[SUHost alloc] initWithBundle:mainBundle]; 20 | 21 | return [mainBundleHost boolForInfoDictionaryKey:enabledKey]; 22 | } 23 | -------------------------------------------------------------------------------- /Sparkle/SUAppcast+Private.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUAppcast+Private.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 4/30/21. 6 | // Copyright © 2021 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #ifdef BUILDING_SPARKLE_SOURCES_EXTERNALLY 12 | // Ignore incorrect warning 13 | #pragma clang diagnostic push 14 | #pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" 15 | #import "SUAppcast.h" 16 | #pragma clang diagnostic pop 17 | #else 18 | #import 19 | #endif 20 | 21 | NS_ASSUME_NONNULL_BEGIN 22 | 23 | @class SPUAppcastItemStateResolver; 24 | 25 | @interface SUAppcast (Private) 26 | 27 | - (nullable instancetype)initWithXMLData:(NSData *)xmlData relativeToURL:(NSURL * _Nullable)relativeURL stateResolver:(SPUAppcastItemStateResolver *)stateResolver error:(NSError * __autoreleasing *)error; 28 | 29 | - (SUAppcast *)copyByFilteringItems:(BOOL (^)(SUAppcastItem *))filterBlock; 30 | 31 | @end 32 | 33 | NS_ASSUME_NONNULL_END 34 | -------------------------------------------------------------------------------- /Sparkle/SUAppcast.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUAppcast.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/12/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUAPPCAST_H 10 | #define SUAPPCAST_H 11 | 12 | #import 13 | #if defined(BUILDING_SPARKLE_SOURCES_EXTERNALLY) 14 | // Ignore incorrect warning 15 | #pragma clang diagnostic push 16 | #pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" 17 | #import "SUExport.h" 18 | #pragma clang diagnostic pop 19 | #else 20 | #import 21 | #endif 22 | 23 | NS_ASSUME_NONNULL_BEGIN 24 | 25 | @class SUAppcastItem; 26 | 27 | /** 28 | The appcast representing a collection of `SUAppcastItem` items in the feed. 29 | */ 30 | SU_EXPORT @interface SUAppcast : NSObject 31 | 32 | - (instancetype)init NS_UNAVAILABLE; 33 | 34 | /** 35 | The collection of update items. 36 | 37 | These `SUAppcastItem` items are in the same order as specified in the appcast XML feed and are thus not sorted by version. 38 | */ 39 | @property (readonly, nonatomic, copy) NSArray *items; 40 | 41 | @end 42 | 43 | NS_ASSUME_NONNULL_END 44 | 45 | #endif 46 | -------------------------------------------------------------------------------- /Sparkle/SUApplicationInfo.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUApplicationInfo.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 2/28/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if SPARKLE_BUILD_UI_BITS || !BUILDING_SPARKLE 10 | 11 | #import 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @class SUHost, NSImage, NSApplication; 16 | 17 | SPU_OBJC_DIRECT_MEMBERS @interface SUApplicationInfo : NSObject 18 | 19 | + (BOOL)isBackgroundApplication:(NSApplication *)application; 20 | 21 | + (NSImage *)bestIconForHost:(SUHost *)host; 22 | 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /Sparkle/SUBundleIcon.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUBundleIcon.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 7/24/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class SUHost; 14 | 15 | SPU_OBJC_DIRECT_MEMBERS @interface SUBundleIcon : NSObject 16 | 17 | + (NSURL * _Nullable)iconURLForHost:(SUHost *)host; 18 | 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /Sparkle/SUBundleIcon.m: -------------------------------------------------------------------------------- 1 | // 2 | // SUBundleIcon.m 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 7/24/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import "SUBundleIcon.h" 10 | #import "SUHost.h" 11 | 12 | 13 | #include "AppKitPrevention.h" 14 | 15 | @implementation SUBundleIcon 16 | 17 | // Note: To obtain the most current bundle icon file from the Info dictionary, this should take a SUHost, not a NSBundle 18 | + (NSURL *)iconURLForHost:(SUHost *)host 19 | { 20 | NSString *resource = [host objectForInfoDictionaryKey:@"CFBundleIconFile"]; 21 | if (resource == nil || ![resource isKindOfClass:[NSString class]]) { 22 | return nil; 23 | } 24 | 25 | NSURL *iconURL = [host.bundle URLForResource:resource withExtension:@"icns"]; 26 | 27 | // The resource could already be containing the path extension, so try again without the extra extension 28 | if (iconURL == nil) { 29 | iconURL = [host.bundle URLForResource:resource withExtension:nil]; 30 | } 31 | return iconURL; 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /Sparkle/SUExport.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUExport.h 3 | // Sparkle 4 | // 5 | // Created by Jake Petroules on 2014-08-23. 6 | // Copyright (c) 2014 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SUEXPORT_H 10 | #define SUEXPORT_H 11 | 12 | #ifdef BUILDING_SPARKLE 13 | #define SU_EXPORT __attribute__((visibility("default"))) 14 | #else 15 | #define SU_EXPORT 16 | #endif 17 | 18 | #endif 19 | -------------------------------------------------------------------------------- /Sparkle/SULegacyWebView.h: -------------------------------------------------------------------------------- 1 | // 2 | // SULegacyWebView.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 12/30/20. 6 | // Copyright © 2020 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if SPARKLE_BUILD_UI_BITS && DOWNLOADER_XPC_SERVICE_EMBEDDED 10 | 11 | #import 12 | #import "SUReleaseNotesView.h" 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | SPU_OBJC_DIRECT_MEMBERS @interface SULegacyWebView : NSObject 17 | 18 | - (instancetype)initWithColorStyleSheetLocation:(NSURL *)colorStyleSheetLocation fontFamily:(NSString *)fontFamily fontPointSize:(int)fontPointSize javaScriptEnabled:(BOOL)javaScriptEnabled customAllowedURLSchemes:(NSArray *)customAllowedURLSchemes; 19 | 20 | @end 21 | 22 | NS_ASSUME_NONNULL_END 23 | 24 | #endif 25 | -------------------------------------------------------------------------------- /Sparkle/SULocalizations.h: -------------------------------------------------------------------------------- 1 | // 2 | // SULocalizations.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 2/28/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SULocalizations_h 10 | #define SULocalizations_h 11 | 12 | #if SPARKLE_COPY_LOCALIZATIONS 13 | #import "SUConstants.h" 14 | 15 | // This should only be used from inside the framework (not helper tools) 16 | #define SUSparkleBundle() ((NSBundle * _Nonnull)([NSBundle bundleWithIdentifier:SUBundleIdentifier])) 17 | 18 | #define SPARKLE_TABLE @"Sparkle" 19 | 20 | #define SULocalizedStringFromTableInBundle(key, tbl, bundle, comment) (NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) ?: key) 21 | 22 | #else 23 | #define SULocalizedStringFromTableInBundle(key, tbl, bundle, comment) key 24 | #endif 25 | 26 | #endif /* SULocalizations_h */ 27 | -------------------------------------------------------------------------------- /Sparkle/SULog+NSError.h: -------------------------------------------------------------------------------- 1 | // 2 | // SULog+NSError.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/19/21. 6 | // Copyright © 2021 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SULog_NSError_h 10 | #define SULog_NSError_h 11 | 12 | #import 13 | 14 | void SULogError(NSError *error); 15 | 16 | #endif /* SULog_NSError_h */ 17 | -------------------------------------------------------------------------------- /Sparkle/SULog.h: -------------------------------------------------------------------------------- 1 | // 2 | // SULog.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 5/18/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SULOG_H 10 | #define SULOG_H 11 | 12 | #include 13 | 14 | typedef NS_ENUM(uint8_t, SULogLevel) { 15 | // This level is for information that *might* result a failure 16 | // For now until other levels are added, this may serve as a level for other information as well 17 | SULogLevelDefault, 18 | // This level is for errors that occurred 19 | SULogLevelError 20 | }; 21 | 22 | // Logging utility function that is thread-safe and uses os_log 23 | // For debugging command line tools, you may have to use Console.app or log(1) to view log messages 24 | // Try to keep log messages as compact/short as possible 25 | void SULog(SULogLevel level, NSString *format, ...) NS_FORMAT_FUNCTION(2, 3); 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /Sparkle/SUNormalization.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUNormalization.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/26/21. 6 | // Copyright © 2021 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SUHost.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | NSString *SUNormalizedInstallationPath(SUHost *host); 15 | 16 | NS_ASSUME_NONNULL_END 17 | -------------------------------------------------------------------------------- /Sparkle/SUOperatingSystem.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUOperatingSystem.h 3 | // Sparkle 4 | // 5 | // Copyright © 2015 Sparkle Project. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | SPU_OBJC_DIRECT_MEMBERS @interface SUOperatingSystem : NSObject 11 | 12 | + (NSString *)systemVersionString; 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /Sparkle/SUOperatingSystem.m: -------------------------------------------------------------------------------- 1 | // 2 | // SUOperatingSystem.m 3 | // Sparkle 4 | // 5 | // Copyright © 2015 Sparkle Project. All rights reserved. 6 | // 7 | 8 | #import "SUOperatingSystem.h" 9 | 10 | 11 | #include "AppKitPrevention.h" 12 | 13 | @implementation SUOperatingSystem 14 | 15 | + (NSString *)systemVersionString 16 | { 17 | NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion]; 18 | return [NSString stringWithFormat:@"%ld.%ld.%ld", (long)version.majorVersion, (long)version.minorVersion, (long)version.patchVersion]; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /Sparkle/SUPhasedUpdateGroupInfo.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUPhasedUpdateGroupInfo.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 01/24/21. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class SUHost; 14 | 15 | #ifndef BUILDING_SPARKLE_TESTS 16 | SPU_OBJC_DIRECT_MEMBERS 17 | #endif 18 | @interface SUPhasedUpdateGroupInfo : NSObject 19 | 20 | + (NSUInteger)updateGroupForHost:(SUHost*)host; 21 | + (NSNumber*)setNewUpdateGroupIdentifierForHost:(SUHost*)host; 22 | 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | -------------------------------------------------------------------------------- /Sparkle/SUPlainTextReleaseNotesView.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUPlainTextReleaseNotesView.h 3 | // Sparkle 4 | // 5 | // Created on 9/11/22. 6 | // Copyright © 2022 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if SPARKLE_BUILD_UI_BITS 10 | 11 | #import 12 | 13 | #import "SUReleaseNotesView.h" 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | SPU_OBJC_DIRECT_MEMBERS @interface SUPlainTextReleaseNotesView : NSObject 18 | 19 | - (instancetype)initWithFontPointSize:(int)fontPointSize customAllowedURLSchemes:(NSArray *)customAllowedURLSchemes; 20 | 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | 25 | #endif 26 | -------------------------------------------------------------------------------- /Sparkle/SUReleaseNotesCommon.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUReleaseNotesCommon.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 12/31/20. 6 | // Copyright © 2020 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if SPARKLE_BUILD_UI_BITS 10 | 11 | #import 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | BOOL SUReleaseNotesIsSafeURL(NSURL *url, NSArray *customAllowedURLSchemes, BOOL *isAboutBlankURL); 16 | 17 | NS_ASSUME_NONNULL_END 18 | 19 | #endif 20 | -------------------------------------------------------------------------------- /Sparkle/SUReleaseNotesCommon.m: -------------------------------------------------------------------------------- 1 | // 2 | // SUReleaseNotesCommon.m 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 12/31/20. 6 | // Copyright © 2020 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if SPARKLE_BUILD_UI_BITS 10 | 11 | #import "SUReleaseNotesCommon.h" 12 | 13 | 14 | #include "AppKitPrevention.h" 15 | 16 | BOOL SUReleaseNotesIsSafeURL(NSURL *url, NSArray *customAllowedURLSchemes, BOOL *isAboutBlankURL) 17 | { 18 | NSString *scheme = url.scheme; 19 | BOOL isAboutBlank = [url.absoluteString isEqualToString:@"about:blank"] || [url.absoluteString isEqualToString:@"about:srcdoc"]; 20 | BOOL safeURL = isAboutBlank || [@[@"http", @"https", @"macappstore", @"macappstores", @"itms-apps", @"itms-appss"] containsObject:scheme] || [customAllowedURLSchemes containsObject:scheme.lowercaseString]; 21 | 22 | *isAboutBlankURL = isAboutBlank; 23 | 24 | return safeURL; 25 | } 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /Sparkle/SUReleaseNotesView.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUReleaseNotesView.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 12/30/20. 6 | // Copyright © 2020 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if SPARKLE_BUILD_UI_BITS 10 | 11 | #import 12 | 13 | @class NSView; 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | @protocol SUReleaseNotesView 18 | 19 | @property (nonatomic, readonly) NSView *view; 20 | 21 | - (void)loadString:(NSString *)string baseURL:(NSURL * _Nullable)baseURL completionHandler:(void (^)(NSError * _Nullable))completionHandler; 22 | 23 | - (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL *)baseURL completionHandler:(void (^)(NSError * _Nullable))completionHandler; 24 | 25 | - (void)stopLoading; 26 | 27 | - (void)setDrawsBackground:(BOOL)drawsBackground; 28 | 29 | @end 30 | 31 | NS_ASSUME_NONNULL_END 32 | 33 | #endif 34 | -------------------------------------------------------------------------------- /Sparkle/SUSystemProfiler.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUSystemProfiler.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 12/22/07. 6 | // Copyright 2007 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUSYSTEMPROFILER_H 10 | #define SUSYSTEMPROFILER_H 11 | 12 | #import 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | @class SUHost; 17 | SPU_OBJC_DIRECT_MEMBERS @interface SUSystemProfiler : NSObject 18 | 19 | + (NSArray *> *)systemProfileArrayForHost:(SUHost *)host; 20 | 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | #endif 25 | -------------------------------------------------------------------------------- /Sparkle/SUTouchBarButtonGroup.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUTouchBarButtonGroup.h 3 | // Sparkle 4 | // 5 | // Created by Yuxin Wang on 05/01/2017. 6 | // Copyright © 2017 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if SPARKLE_BUILD_UI_BITS || !BUILDING_SPARKLE 10 | 11 | #import 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | SPU_OBJC_DIRECT_MEMBERS @interface SUTouchBarButtonGroup : NSViewController 16 | 17 | @property (nonatomic, readonly, copy) NSArray *buttons; 18 | 19 | - (instancetype)initByReferencingButtons:(NSArray *)buttons; 20 | 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | 25 | #endif 26 | -------------------------------------------------------------------------------- /Sparkle/SUUpdateAlert.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUpdateAlert.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/12/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #if SPARKLE_BUILD_UI_BITS 10 | 11 | #ifndef SUUPDATEALERT_H 12 | #define SUUPDATEALERT_H 13 | 14 | #import 15 | #import "SUVersionDisplayProtocol.h" 16 | #import "SPUUserUpdateState.h" 17 | 18 | @protocol SUUpdateAlertDelegate; 19 | 20 | @class SUAppcastItem, SPUDownloadData, SUHost; 21 | SPU_OBJC_DIRECT_MEMBERS @interface SUUpdateAlert : NSWindowController 22 | 23 | - (instancetype)initWithAppcastItem:(SUAppcastItem *)item state:(SPUUserUpdateState *)state host:(SUHost *)aHost versionDisplayer:(id)versionDisplayer completionBlock:(void (^)(SPUUserUpdateChoice, NSRect, BOOL))completionBlock didBecomeKeyBlock:(void (^)(void))didBecomeKeyBlock; 24 | 25 | - (void)showUpdateReleaseNotesWithDownloadData:(SPUDownloadData *)downloadData; 26 | - (void)showReleaseNotesFailedToDownload; 27 | 28 | - (void)setInstallButtonFocus:(BOOL)focus; 29 | 30 | @end 31 | 32 | #endif 33 | 34 | #endif 35 | -------------------------------------------------------------------------------- /Sparkle/SUUpdatePermissionPrompt.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUpdatePermissionPrompt.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 1/24/08. 6 | // Copyright 2008 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #if SPARKLE_BUILD_UI_BITS 10 | 11 | #ifndef SUUPDATEPERMISSIONPROMPT_H 12 | #define SUUPDATEPERMISSIONPROMPT_H 13 | 14 | #import 15 | 16 | @class SUHost, SPUUpdatePermissionRequest, SUUpdatePermissionResponse; 17 | 18 | SPU_OBJC_DIRECT_MEMBERS @interface SUUpdatePermissionPrompt : NSWindowController 19 | 20 | - (instancetype)initPromptWithHost:(SUHost *)theHost request:(SPUUpdatePermissionRequest *)request reply:(void (^)(SUUpdatePermissionResponse *))reply; 21 | 22 | @end 23 | 24 | #endif 25 | 26 | #endif 27 | -------------------------------------------------------------------------------- /Sparkle/SUUpdateValidator.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUpdateValidator.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 12/3/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class SUHost; 12 | @class SUSignatures; 13 | @class SPUVerifierInformation; 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | #ifndef BUILDING_SPARKLE_TESTS 18 | SPU_OBJC_DIRECT_MEMBERS 19 | #endif 20 | @interface SUUpdateValidator : NSObject 21 | 22 | - (instancetype)init NS_UNAVAILABLE; 23 | 24 | - (instancetype)initWithDownloadPath:(NSString *)downloadPath signatures:(SUSignatures *)signatures host:(SUHost *)host verifierInformation:(SPUVerifierInformation * _Nullable)verifierInformation; 25 | 26 | - (BOOL)validateHostHasPublicKeys:(NSError **)error; 27 | 28 | // This is "pre" validation, before the archive has been extracted 29 | - (BOOL)validateDownloadPathWithFallbackOnCodeSigning:(BOOL)fallbackOnCodeSigning error:(NSError **)error; 30 | 31 | // This is "post" validation, after an archive has been extracted 32 | - (BOOL)validateWithUpdateDirectory:(NSString *)updateDirectory error:(NSError **)error; 33 | 34 | @end 35 | 36 | NS_ASSUME_NONNULL_END 37 | -------------------------------------------------------------------------------- /Sparkle/SUVersionComparisonProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUVersionComparisonProtocol.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 12/21/07. 6 | // Copyright 2007 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUVERSIONCOMPARISONPROTOCOL_H 10 | #define SUVERSIONCOMPARISONPROTOCOL_H 11 | 12 | #import 13 | 14 | #if defined(BUILDING_SPARKLE_SOURCES_EXTERNALLY) 15 | // Ignore incorrect warning 16 | #pragma clang diagnostic push 17 | #pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" 18 | #import "SUExport.h" 19 | #pragma clang diagnostic pop 20 | #else 21 | #import 22 | #endif 23 | 24 | NS_ASSUME_NONNULL_BEGIN 25 | 26 | /** 27 | Provides version comparison facilities for Sparkle. 28 | */ 29 | @protocol SUVersionComparison 30 | 31 | /** 32 | An abstract method to compare two version strings. 33 | 34 | Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, 35 | and NSOrderedSame if they are equivalent. 36 | */ 37 | - (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; // *** MAY BE CALLED ON NON-MAIN THREAD! 38 | 39 | @end 40 | 41 | NS_ASSUME_NONNULL_END 42 | #endif 43 | -------------------------------------------------------------------------------- /Sparkle/SUWKWebView.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUWKWebView.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 12/30/20. 6 | // Copyright © 2020 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if SPARKLE_BUILD_UI_BITS 10 | 11 | #import 12 | #import "SUReleaseNotesView.h" 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | SPU_OBJC_DIRECT_MEMBERS @interface SUWKWebView : NSObject 17 | 18 | - (instancetype)initWithColorStyleSheetLocation:(NSURL *)colorStyleSheetLocation fontFamily:(NSString *)fontFamily fontPointSize:(int)fontPointSize javaScriptEnabled:(BOOL)javaScriptEnabled customAllowedURLSchemes:(NSArray *)customAllowedURLSchemes installedVersion:(NSString *)installedVersion; 19 | 20 | @end 21 | 22 | NS_ASSUME_NONNULL_END 23 | 24 | #endif 25 | -------------------------------------------------------------------------------- /Sparkle/Sparkle-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | $(MARKETING_VERSION) 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | ${CURRENT_PROJECT_VERSION} 25 | NSPrincipalClass 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /Sparkle/Sparkle.private.modulemap: -------------------------------------------------------------------------------- 1 | // 2 | // Sparkle.private.modulemap 3 | // Sparkle 4 | // 5 | // Created on 4/30/25. 6 | // Copyright © 2025 Sparkle Project. All rights reserved. 7 | // 8 | 9 | framework module Sparkle_Private { 10 | // Nothing exported here 11 | } 12 | 13 | explicit module Sparkle_Private.SPUStandardUserDriver { 14 | header "SPUStandardUserDriver+Private.h" 15 | export * 16 | } 17 | 18 | explicit module Sparkle_Private.SPUGentleUserDriverReminders { 19 | header "SPUGentleUserDriverReminders.h" 20 | export * 21 | } 22 | 23 | explicit module Sparkle_Private.SPUUserAgent { 24 | header "SPUUserAgent+Private.h" 25 | export * 26 | } 27 | 28 | explicit module Sparkle_Private.SUAppcastItem { 29 | header "SUAppcastItem+Private.h" 30 | header "SPUAppcastItemStateResolver.h" 31 | export * 32 | } 33 | 34 | explicit module Sparkle_Private.SUInstallerLauncher { 35 | header "SUInstallerLauncher+Private.h" 36 | header "SPUInstallationType.h" 37 | export * 38 | } 39 | -------------------------------------------------------------------------------- /Sparkle/ar.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "محدث البرنامج"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "معلومات عن الإصدار:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "تذكيري لاحقًا"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "تخطي هذا الإصدار"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "تثبيت التحديث"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "تنزيل التحديثات وتثبيتها تلقائيًا في المستقبل"; 18 | -------------------------------------------------------------------------------- /Sparkle/ca.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Actualització del programari"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Notes d'aquesta versió:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Recorda-m'ho més tard"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Omet aquesta versió"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Instal·la l'actualització"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Descarrega i instal·la les actualitzacions automàticament en el futur"; 18 | -------------------------------------------------------------------------------- /Sparkle/cs.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Aktualizace aplikace"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Poznámky k vydání:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Připomenout později"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Přeskočit tuto verzi"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Instalovat aktualizaci"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "V budoucnu stahovat a instalovat aktualizace automaticky"; 18 | -------------------------------------------------------------------------------- /Sparkle/da.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Software Update"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Om denne udgivelse:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Påmind mig senere"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Spring over"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Installer"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Hent og installer opdateringer automatisk i fremtiden"; 18 | -------------------------------------------------------------------------------- /Sparkle/de.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Softwareupdate"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Versionshinweise:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Später erinnern"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Diese Version überspringen"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Installieren"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Updates in Zukunft automatisch laden und installieren"; 18 | -------------------------------------------------------------------------------- /Sparkle/el.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Ενημέρωση προγράμματος"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Σημειώσεις Έκδοσης:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Υπενθύμιση Αργότερα"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Παράλειψη Έκδοσης"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Εγκατάσταση Ενημέρωσης"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Αυτόματη λήψη και εγκατάσταση ενημερώσεων στο μέλλον"; 18 | -------------------------------------------------------------------------------- /Sparkle/en.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 3 | "5.title" = "Software Update"; 4 | 5 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 6 | "170.title" = "Release Notes:"; 7 | 8 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 9 | "171.title" = "Remind Me Later"; 10 | 11 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 12 | "172.title" = "Skip This Version"; 13 | 14 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 15 | "173.title" = "Install Update"; 16 | 17 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 18 | "175.title" = "Automatically download and install updates in the future"; 19 | -------------------------------------------------------------------------------- /Sparkle/es.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Actualización de software"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Notas de la versión:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Recordármelo"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "No instalar esta versión"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Instalar actualización"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Descargar e instalar actualizaciones automáticamente"; 18 | -------------------------------------------------------------------------------- /Sparkle/fi.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Ohjelmiston pävitys"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Tietoa päivityksestä:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Muistuta myöhemmin"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Ohita tämä versio"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Asenna päivitys"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Hae ja asenna päivitykset jatkossa automaattisesti"; 18 | -------------------------------------------------------------------------------- /Sparkle/fr.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Mise à jour logiciel"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Notes de version :"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Pas maintenant"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Ignorer cette version"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Installer"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Télécharger et installer automatiquement les mises à jour"; 18 | -------------------------------------------------------------------------------- /Sparkle/he.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "עדכון תוכנה"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "הערות שחרור:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "הזכר לי מאוחר יותר"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "דלג על גרסה זו"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "התקן את העדכון"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "הורד והתקן עדכונים בעתיד באופן אוטומטי"; 18 | -------------------------------------------------------------------------------- /Sparkle/hr.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Aktualiziranje softvera"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Napomene uz izdanje:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Podsjeti me kasnije"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Zanemari ovu verziju"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Instaliraj nadogradnju"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Ubuduće preuzmi i instaliraj nadogradnje automatski"; 18 | -------------------------------------------------------------------------------- /Sparkle/hu.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Szoftverfrissítés"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Változások az előző verzióhoz képest:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Emlékeztessen később"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Verzió kihagyása"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Telepítés"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "A jövőben automatikusan töltse le és telepítse a frissítéseket"; 18 | -------------------------------------------------------------------------------- /Sparkle/is.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Hugbúnaðaruppfærsla"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Útgáfupunktar:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Áminntu mig síðar"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Sleppa þessari útgáfu"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Innsetja"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Sækja og innsetja uppfærslur sjálfkrafa framvegis"; 18 | -------------------------------------------------------------------------------- /Sparkle/it.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Aggiornamento Software"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Note di rilascio:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Ricordamelo più tardi"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Ignora questa versione"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Installa"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "In futuro scarica e installa automaticamente gli aggiornamenti"; 18 | -------------------------------------------------------------------------------- /Sparkle/ja.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "ソフトウェア・アップデート"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "リリースノート:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "あとで通知"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "このバージョンはスキップ"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "アップデートをインストール"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "今後はアップデートのダウンロードとインストールを自動で行う"; 18 | -------------------------------------------------------------------------------- /Sparkle/ja.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "43"; */ 2 | "43.title" = "Text Cell"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "45"; */ 5 | "45.title" = "Text Cell"; 6 | 7 | /* Class = "NSTextFieldCell"; title = "Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this.\n\nThis is the information that would be sent:"; ObjectID = "183"; */ 8 | "183.title" = "匿名のシステムプロファイル情報は、今後の開発の参考にさせていただきます。この件に関してご質問があればご連絡下さい。\n\n以下の情報が送信されます:"; 9 | 10 | /* Class = "NSButtonCell"; title = "Don’t Check"; ObjectID = "cCJ-V0-aTi"; */ 11 | "cCJ-V0-aTi.title" = "確認しない"; 12 | 13 | /* Class = "NSTextFieldCell"; title = "Check for updates automatically?"; ObjectID = "gmh-T4-BO0"; */ 14 | "gmh-T4-BO0.title" = "アップデートを自動で確認しますか?"; 15 | 16 | /* Class = "NSButtonCell"; title = "Include anonymous system profile"; ObjectID = "gz7-LM-gNf"; */ 17 | "gz7-LM-gNf.title" = "匿名のシステム情報を含める"; 18 | 19 | /* Class = "NSButtonCell"; title = "Check Automatically"; ObjectID = "OhZ-1K-DmA"; */ 20 | "OhZ-1K-DmA.title" = "自動で確認"; 21 | 22 | /* Class = "NSButtonCell"; title = "Automatically download and install updates"; ObjectID = "AUc-33-qGN"; */ 23 | "AUc-33-qGN.title" = "アップデートを自動でダウンロードしてインストール"; 24 | -------------------------------------------------------------------------------- /Sparkle/ko.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "소프트웨어 업데이트"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "릴리즈 노트:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "나중에"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "이 버전 건너뛰기"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "업데이트 설치"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "향후 업데이트 자동 다운로드 및 설치"; 18 | -------------------------------------------------------------------------------- /Sparkle/ko.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "43"; */ 2 | "43.title" = "Text Cell"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "45"; */ 5 | "45.title" = "Text Cell"; 6 | 7 | /* Class = "NSButtonCell"; title = "Check Automatically"; ObjectID = "176"; */ 8 | "OhZ-1K-DmA.title" = "자동으로 확인"; 9 | 10 | /* Class = "NSButtonCell"; title = "Don’t Check"; ObjectID = "177"; */ 11 | "cCJ-V0-aTi.title" = "취소"; 12 | 13 | /* Class = "NSTextFieldCell"; title = "Check for updates automatically?"; ObjectID = "178"; */ 14 | "gmh-T4-BO0.title" = "업데이트를 자동으로 확인할까요?"; 15 | 16 | /* Class = "NSButtonCell"; title = "Include anonymous system profile"; ObjectID = "180"; */ 17 | "gz7-LM-gNf.title" = "익명 시스템 정보 포함"; 18 | 19 | /* Class = "NSButtonCell"; title = "Automatically download and install updates"; ObjectID = "AUc-33-qGN"; */ 20 | "AUc-33-qGN.title" = "업데이트 자동 다운로드 및 설치"; 21 | 22 | /* Class = "NSTextFieldCell"; title = "Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this.\n\nThis is the information that would be sent:"; ObjectID = "183"; */ 23 | "183.title" = "익명으로 보내지는 시스템 정보로 차후 프로그램 개발에 도움이 될 수 있습니다. 질문이 있으시면 연락 주십시오.\n\n아래 정보가 전송될 것입니다."; 24 | -------------------------------------------------------------------------------- /Sparkle/nb.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Programoppdatering"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Om oppdateringen:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Utsett"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Hopp over"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Installer"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Last ned og installer automatisk i fremtiden"; 18 | 19 | -------------------------------------------------------------------------------- /Sparkle/nl.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Software-update"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Versiegegevens:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Herinner mij later"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Sla deze versie over"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Installeer update"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Download en installeer updates voortaan automatisch"; 18 | -------------------------------------------------------------------------------- /Sparkle/nl.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSTextFieldCell"; title = "Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this.\n\nThis is the information that would be sent:"; ObjectID = "183"; */ 2 | "183.title" = "Aan de hand van anonieme informatie over het systeemprofiel kunnen wij toekomstige ontwikkelingswerkzaamheden beter plannen. Neem contact met ons op als je hierover vragen hebt.\n\nDit is de informatie die wordt verzonden:"; 3 | 4 | /* Class = "NSButtonCell"; title = "Don’t Check"; ObjectID = "cCJ-V0-aTi"; */ 5 | "cCJ-V0-aTi.title" = "Zoek niet"; 6 | 7 | /* Class = "NSTextFieldCell"; title = "Check for updates automatically?"; ObjectID = "gmh-T4-BO0"; */ 8 | "gmh-T4-BO0.title" = "Automatisch zoeken naar updates?"; 9 | 10 | /* Class = "NSButtonCell"; title = "Include anonymous system profile"; ObjectID = "gz7-LM-gNf"; */ 11 | "gz7-LM-gNf.title" = "Voeg anoniem systeemprofiel bij"; 12 | 13 | /* Class = "NSButtonCell"; title = "Automatically download and install updates"; ObjectID = "AUc-33-qGN"; */ 14 | "AUc-33-qGN.title" = "Download en installeer updates automatisch"; 15 | 16 | /* Class = "NSButtonCell"; title = "Check Automatically"; ObjectID = "OhZ-1K-DmA"; */ 17 | "OhZ-1K-DmA.title" = "Zoek automatisch"; 18 | -------------------------------------------------------------------------------- /Sparkle/nn.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Programoppdatering"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Om oppdateringa:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Utsett"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Hopp over"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Installer"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Last ned og installer automatisk i framtida"; 18 | 19 | -------------------------------------------------------------------------------- /Sparkle/pl.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Uaktualnienie oprogramowania"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Szczegóły wydania:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Przypomnij później"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Pomiń tę wersję"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Zainstaluj teraz"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Automatycznie pobierz i zainstaluj przyszłe uaktualnienia"; 18 | -------------------------------------------------------------------------------- /Sparkle/pt-BR.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Atualização de Software"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Notas do Lançamento:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Mais Tarde"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Ignorar Esta Versão"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Instalar Atualização"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Baixar e instalar atualizações futuras automaticamente"; 18 | -------------------------------------------------------------------------------- /Sparkle/pt-PT.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Actualização de Software"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Notas de lançamento:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Lembrar mais tarde"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Saltar esta versão"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Instalar actualização"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "No futuro, transferir e instalar actualizações automaticamente"; 18 | -------------------------------------------------------------------------------- /Sparkle/ro.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Actualizarea aplicației"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Note de ediție:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Amintește-mi mai târziu"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Sari peste…"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Instalează actualizarea"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "În viitor descarcă și instalează în automat actualizările"; 18 | -------------------------------------------------------------------------------- /Sparkle/ru.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Обновление программного обеспечения"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Заметки о выпуске:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Напоминать позже"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Пропустить эту версию"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Установить обновление"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Автоматически загружать и устанавливать обновления в будущем"; 18 | -------------------------------------------------------------------------------- /Sparkle/sk.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Aktualizácia softvéru"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Poznámky k vydaniu:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Pripomenúť neskôr"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Vynechať túto verziu"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Nainštalovať"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "V budúcnosti aktualizácie preberať a inštalovať automaticky"; 18 | -------------------------------------------------------------------------------- /Sparkle/sl.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Posodabljanje programske opreme"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Opombe ob izdaji:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Spomni me kasneje"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Preskoči to verzijo"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Namesti posodobitev"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "V prihodnje samodejno nameščaj posodobitve"; 18 | -------------------------------------------------------------------------------- /Sparkle/sv.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Programuppdatering"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Versionsinformation:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Påminn mig senare"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Hoppa över denna version"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Installera uppdatering"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Hämta och installera nya uppdateringar automatiskt i framtiden."; 18 | -------------------------------------------------------------------------------- /Sparkle/th.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "อัพเดทซอฟต์แวร์"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Release Notes:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "เตือนในภายหลัง"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "ข้ามเวอร์ชั่นนี้"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "ติดตั้งอัพเดท"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "ดาวน์โหลดและติดตั้งอัพเดทโดยอัตโนมัติในอนาคต"; 18 | -------------------------------------------------------------------------------- /Sparkle/tr.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Yazılım Güncelleme"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Sürüm notları:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Daha Sonra Anımsat"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Bu Sürümü Atla"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Yükle"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Gelecekte güncellemeleri otomatik olarak indir ve yükle"; 18 | -------------------------------------------------------------------------------- /Sparkle/uk.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Оновлення програмного забезпечення"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Примітки про нову версію:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Нагадати пізніше"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Пропустити цю версію"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Встановити оновлення"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Автоматично завантажувати та встановлювати оновлення у майбутньому"; 18 | -------------------------------------------------------------------------------- /Sparkle/zh_CN.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "软件更新"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "更新信息:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "稍后提示我"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "跳过这个版本"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "安装更新"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "以后自动下载并安装更新"; 18 | -------------------------------------------------------------------------------- /Sparkle/zh_CN.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "43"; */ 2 | "43.title" = "Text Cell"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "45"; */ 5 | "45.title" = "Text Cell"; 6 | 7 | /* Class = "NSTextFieldCell"; title = "Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this.\n\nThis is the information that would be sent:"; ObjectID = "183"; */ 8 | "183.title" = "无记名系统概况信息被用于帮助我们安排将来的开发工作。如果对此存在疑问请联系我们。\n\n这是将要被发送的信息::"; 9 | 10 | /* Class = "NSButtonCell"; title = "Don’t Check"; ObjectID = "cCJ-V0-aTi"; */ 11 | "cCJ-V0-aTi.title" = "不核查"; 12 | 13 | /* Class = "NSTextFieldCell"; title = "Check for updates automatically?"; ObjectID = "gmh-T4-BO0"; */ 14 | "gmh-T4-BO0.title" = "自动核查更新?"; 15 | 16 | /* Class = "NSButtonCell"; title = "Include anonymous system profile"; ObjectID = "gz7-LM-gNf"; */ 17 | "gz7-LM-gNf.title" = "包括无记名系统概况"; 18 | 19 | /* Class = "NSButtonCell"; title = "Automatically download and install updates"; ObjectID = "AUc-33-qGN"; */ 20 | "AUc-33-qGN.title" = "自动下载并安装更新"; 21 | 22 | /* Class = "NSButtonCell"; title = "Check Automatically"; ObjectID = "OhZ-1K-DmA"; */ 23 | "OhZ-1K-DmA.title" = "自动核查"; 24 | -------------------------------------------------------------------------------- /Sparkle/zh_HK.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "軟體更新"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "更新事項:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "稍後提醒我"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "跳過此版本"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "安裝更新"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "以後自動下載並安裝更新"; 18 | -------------------------------------------------------------------------------- /Sparkle/zh_HK.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "43"; */ 2 | "43.title" = "Text Cell"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "45"; */ 5 | "45.title" = "Text Cell"; 6 | 7 | /* Class = "NSTextFieldCell"; title = "Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this.\n\nThis is the information that would be sent:"; ObjectID = "183"; */ 8 | "183.title" = "匿名系統概況資訊可用來協助我等計畫未來開發工作。若對此有任何疑問,請聯繫我等。\n\n以下係會傳送嘅資訊:"; 9 | 10 | /* Class = "NSButtonCell"; title = "Don’t Check"; ObjectID = "cCJ-V0-aTi"; */ 11 | "cCJ-V0-aTi.title" = "毋檢查"; 12 | 13 | /* Class = "NSTextFieldCell"; title = "Check for updates automatically?"; ObjectID = "gmh-T4-BO0"; */ 14 | "gmh-T4-BO0.title" = "自動檢查更新?"; 15 | 16 | /* Class = "NSButtonCell"; title = "Include anonymous system profile"; ObjectID = "gz7-LM-gNf"; */ 17 | "gz7-LM-gNf.title" = "包含匿名系統概況"; 18 | 19 | /* Class = "NSButtonCell"; title = "Automatically download and install updates"; ObjectID = "AUc-33-qGN"; */ 20 | "AUc-33-qGN.title" = "自動下載並安裝更新"; 21 | 22 | /* Class = "NSButtonCell"; title = "Check Automatically"; ObjectID = "OhZ-1K-DmA"; */ 23 | "OhZ-1K-DmA.title" = "自動檢查"; 24 | -------------------------------------------------------------------------------- /Sparkle/zh_TW.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "軟體更新"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "更新事項:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "暫緩提醒"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "跳過此版本"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "安裝更新項目"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "自動下載並安裝未來的更新項目"; 18 | -------------------------------------------------------------------------------- /Sparkle/zh_TW.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "43"; */ 2 | "43.title" = "Text Cell"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "45"; */ 5 | "45.title" = "Text Cell"; 6 | 7 | /* Class = "NSTextFieldCell"; title = "Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this.\n\nThis is the information that would be sent:"; ObjectID = "183"; */ 8 | "183.title" = "匿名系統描述資訊可用來協助我們計畫未來的開發工作。若您有任何相關問題,請與我們聯繫。\n\n以下是會傳送的資訊:"; 9 | 10 | /* Class = "NSButtonCell"; title = "Don’t Check"; ObjectID = "cCJ-V0-aTi"; */ 11 | "cCJ-V0-aTi.title" = "不要檢查"; 12 | 13 | /* Class = "NSTextFieldCell"; title = "Check for updates automatically?"; ObjectID = "gmh-T4-BO0"; */ 14 | "gmh-T4-BO0.title" = "自動檢查更新項目?"; 15 | 16 | /* Class = "NSButtonCell"; title = "Include anonymous system profile"; ObjectID = "gz7-LM-gNf"; */ 17 | "gz7-LM-gNf.title" = "包含匿名的系統描述資料"; 18 | 19 | /* Class = "NSButtonCell"; title = "Automatically download and install updates"; ObjectID = "AUc-33-qGN"; */ 20 | "AUc-33-qGN.title" = "自動下載並安裝更新項目"; 21 | 22 | /* Class = "NSButtonCell"; title = "Check Automatically"; ObjectID = "OhZ-1K-DmA"; */ 23 | "OhZ-1K-DmA.title" = "自動檢查"; 24 | -------------------------------------------------------------------------------- /TestAppHelper/TestAppHelper.h: -------------------------------------------------------------------------------- 1 | // 2 | // TestAppHelper.h 3 | // TestAppHelper 4 | // 5 | // Created by Mayur Pawashe on 3/2/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "TestAppHelperProtocol.h" 11 | 12 | @protocol SPUUserDriver; 13 | 14 | // This object implements the protocol which we have defined. It provides the actual behavior for the service. It is 'exported' by the service to make it available to the process hosting the service over an NSXPCConnection. 15 | @interface TestAppHelper : NSObject 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /TestAppHelper/TestAppHelper.m: -------------------------------------------------------------------------------- 1 | // 2 | // TestAppHelper.m 3 | // TestAppHelper 4 | // 5 | // Created by Mayur Pawashe on 3/2/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import "TestAppHelper.h" 10 | #import "SUAdHocCodeSigning.h" 11 | 12 | @implementation TestAppHelper 13 | 14 | - (void)codeSignApplicationAtPath:(NSString *)applicationPath reply:(void (^)(BOOL))reply 15 | { 16 | reply([SUAdHocCodeSigning codeSignApplicationAtPath:applicationPath]); 17 | } 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /TestAppHelper/TestAppHelperProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // TestAppHelperProtocol.h 3 | // TestAppHelper 4 | // 5 | // Created by Mayur Pawashe on 3/2/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | // The protocol that this service will vend as its API. This header file will also need to be visible to the process hosting the service. 12 | @protocol TestAppHelperProtocol 13 | 14 | - (void)codeSignApplicationAtPath:(NSString *)applicationPath reply:(void (^)(BOOL))reply; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /TestApplication/Base.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | NSHumanReadableCopyright = "© Andy Matuschak, 2006"; 4 | -------------------------------------------------------------------------------- /TestApplication/SUAdHocCodeSigning.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUAdHocCodeSigning.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/4/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | SPU_OBJC_DIRECT_MEMBERS @interface SUAdHocCodeSigning : NSObject 12 | 13 | + (BOOL)codeSignApplicationAtPath:(NSString *)applicationPath; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /TestApplication/SUAdHocCodeSigning.m: -------------------------------------------------------------------------------- 1 | // 2 | // SUAdHocCodeSigning.m 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/4/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import "SUAdHocCodeSigning.h" 10 | 11 | @implementation SUAdHocCodeSigning 12 | 13 | + (BOOL)codeSignApplicationAtPath:(NSString *)applicationPath 14 | { 15 | BOOL success = NO; 16 | @try 17 | { 18 | // ad-hoc signing with the dash 19 | NSArray *arguments = @[ @"--force", @"--deep", @"--sign", @"-", applicationPath ]; 20 | NSTask *task = [NSTask launchedTaskWithLaunchPath:@"/usr/bin/codesign" arguments:arguments]; 21 | [task waitUntilExit]; 22 | success = (task.terminationStatus == 0); 23 | } 24 | @catch (NSException *exception) 25 | { 26 | NSLog(@"Failed to code sign application at %@", applicationPath); 27 | NSLog(@"Exception: %@", exception); 28 | } 29 | return success; 30 | } 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /TestApplication/SUInstallUpdateViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUInstallUpdateViewController.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/5/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | SPU_OBJC_DIRECT_MEMBERS @interface SUInstallUpdateViewController : NSViewController 13 | 14 | - (instancetype)initWithAppcastItem:(SUAppcastItem *)appcastItem reply:(void (^)(SPUUserUpdateChoice))reply; 15 | 16 | - (void)showReleaseNotesWithDownloadData:(SPUDownloadData *)downloadData; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /TestApplication/SUPopUpTitlebarUserDriver.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUPopUpTitlebarUserDriver.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/5/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @class NSWindow; 13 | 14 | SPU_OBJC_DIRECT_MEMBERS @interface SUPopUpTitlebarUserDriver : NSObject 15 | 16 | - (instancetype)initWithWindow:(NSWindow *)window; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /TestApplication/SUTestApplicationDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUTestApplicationDelegate.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 7/25/15. 6 | // Copyright (c) 2015 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SUTestApplicationDelegate : NSObject 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /TestApplication/SUTestWebServer.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUTestWebServer.h 3 | // Sparkle 4 | // 5 | // Created by Kevin Wojniak on 10/8/15. 6 | // Copyright © 2015 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | SPU_OBJC_DIRECT_MEMBERS @interface SUTestWebServer : NSObject 12 | 13 | - (instancetype)initWithPort:(int)port workingDirectory:(NSString*)workingDirectory; 14 | 15 | - (void)close; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /TestApplication/SUUpdateSettingsWindowController.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUpdateSettingsWindowController.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 7/25/15. 6 | // Copyright (c) 2015 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class SPUUpdater; 12 | 13 | @interface SUUpdateSettingsWindowController : NSWindowController 14 | 15 | @property (nonatomic) SPUUpdater *updater; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /TestApplication/SUUpdateSettingsWindowController.m: -------------------------------------------------------------------------------- 1 | // 2 | // SUUpdateSettingsWindowController.m 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 7/25/15. 6 | // Copyright (c) 2015 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import "SUUpdateSettingsWindowController.h" 10 | #import 11 | 12 | // This class binds to various updater properties in the nib 13 | @implementation SUUpdateSettingsWindowController 14 | 15 | @synthesize updater = _updater; 16 | 17 | - (NSString *)windowNibName 18 | { 19 | return NSStringFromClass([self class]); 20 | } 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /TestApplication/Sparkle-Test-App.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.network.server 8 | 9 | com.apple.security.network.client 10 | 11 | com.apple.security.temporary-exception.mach-lookup.global-name 12 | 13 | $(PRODUCT_BUNDLE_IDENTIFIER)-spks 14 | $(PRODUCT_BUNDLE_IDENTIFIER)-spki 15 | 16 | com.apple.security.temporary-exception.shared-preference.read-write 17 | 18 | $(PRODUCT_BUNDLE_IDENTIFIER) 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /TestApplication/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/12/06. 6 | // Copyright Andy Matuschak 2006. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, const char *argv[]) 12 | { 13 | return NSApplicationMain(argc, argv); 14 | } 15 | -------------------------------------------------------------------------------- /TestApplication/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/TestApplication/screenshot.png -------------------------------------------------------------------------------- /Tests/.swiftlint.yml: -------------------------------------------------------------------------------- 1 | # Inherits from top level config 2 | disabled_rules: 3 | - force_try 4 | - force_cast 5 | -------------------------------------------------------------------------------- /Tests/Resources/DevSignedApp.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/DevSignedApp.zip -------------------------------------------------------------------------------- /Tests/Resources/DevSignedAppVersion2.dmg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/DevSignedAppVersion2.dmg -------------------------------------------------------------------------------- /Tests/Resources/DevSignedAppVersion2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/DevSignedAppVersion2.zip -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/Both.bundle/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleInfoDictionaryVersion 6 | 6.0 7 | CFBundlePackageType 8 | BNDL 9 | CFBundleSignature 10 | ???? 11 | CFBundleVersion 12 | 1.0 13 | SUPublicEDKey 14 | rhHib+w769W2/6/t+oM1ZxgjBB93BfBKMLO0Qo1etQs= 15 | SUPublicDSAKeyFile 16 | test-pubkey.pem 17 | CFBundleIdentifier 18 | org.sparkle-project.Sparkle.SUUpdateValidatorTestBundle.Both 19 | 20 | 21 | -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedBoth.bundle/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleInfoDictionaryVersion 6 | 6.0 7 | CFBundlePackageType 8 | BNDL 9 | CFBundleSignature 10 | ???? 11 | CFBundleVersion 12 | 1.0 13 | SUPublicEDKey 14 | rhHib+w769W2/6/t+oM1ZxgjBB93BfBKMLO0Qo1etQs= 15 | SUPublicDSAKeyFile 16 | test-pubkey.pem 17 | CFBundleIdentifier 18 | org.sparkle-project.Sparkle.SUUpdateValidatorTestBundle.CodeSignedBoth 19 | 20 | 21 | -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedBoth.bundle/Contents/_CodeSignature/CodeDirectory: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedBoth.bundle/Contents/_CodeSignature/CodeDirectory -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedBoth.bundle/Contents/_CodeSignature/CodeRequirements: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedBoth.bundle/Contents/_CodeSignature/CodeRequirements -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedBoth.bundle/Contents/_CodeSignature/CodeRequirements-1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedBoth.bundle/Contents/_CodeSignature/CodeRequirements-1 -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedBoth.bundle/Contents/_CodeSignature/CodeSignature: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedBoth.bundle/Contents/_CodeSignature/CodeSignature -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedBothNew.bundle/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleInfoDictionaryVersion 6 | 6.0 7 | CFBundlePackageType 8 | BNDL 9 | CFBundleSignature 10 | ???? 11 | CFBundleVersion 12 | 1.0 13 | SUPublicEDKey 14 | rhHib+w769W2/6/t+oM1ZxgjBB93BfBKMLO0Qo1etQs= 15 | SUPublicDSAKeyFile 16 | test-pubkey.pem 17 | CFBundleIdentifier 18 | org.sparkle-project.Sparkle.SUUpdateValidatorTestBundle.CodeSignedBothNew 19 | 20 | 21 | -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedBothNew.bundle/Contents/_CodeSignature/CodeDirectory: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedBothNew.bundle/Contents/_CodeSignature/CodeDirectory -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedBothNew.bundle/Contents/_CodeSignature/CodeRequirements: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedBothNew.bundle/Contents/_CodeSignature/CodeRequirements -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedBothNew.bundle/Contents/_CodeSignature/CodeRequirements-1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedBothNew.bundle/Contents/_CodeSignature/CodeRequirements-1 -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedBothNew.bundle/Contents/_CodeSignature/CodeSignature: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedBothNew.bundle/Contents/_CodeSignature/CodeSignature -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalid.bundle/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleInfoDictionaryVersion 6 | 6.0 7 | CFBundlePackageType 8 | BNDL 9 | CFBundleSignature 10 | ???? 11 | CFBundleVersion 12 | 1.0 13 | SUPublicEDKey 14 | rhHib+w769W2/6/t+oM1ZxgjBB93BfBKMLO0Qo1etQs= 15 | SUPublicDSAKeyFile 16 | test-pubkey.pem 17 | CFBundleIdentifier 18 | org.sparkle-project.Sparkle.SUUpdateValidatorTestBundle.CodeSignedInvalid 19 | 20 | 21 | -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalid.bundle/Contents/_CodeSignature/CodeDirectory: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalid.bundle/Contents/_CodeSignature/CodeDirectory -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalid.bundle/Contents/_CodeSignature/CodeRequirements: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalid.bundle/Contents/_CodeSignature/CodeRequirements -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalid.bundle/Contents/_CodeSignature/CodeRequirements-1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalid.bundle/Contents/_CodeSignature/CodeRequirements-1 -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalid.bundle/Contents/_CodeSignature/CodeSignature: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalid.bundle/Contents/_CodeSignature/CodeSignature -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalidOnly.bundle/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleInfoDictionaryVersion 6 | 6.0 7 | CFBundlePackageType 8 | BNDL 9 | CFBundleSignature 10 | ???? 11 | CFBundleVersion 12 | 1.0 13 | CFBundleIdentifier 14 | org.sparkle-project.Sparkle.SUUpdateValidatorTestBundle.CodeSignedInvalidOnly 15 | 16 | 17 | -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalidOnly.bundle/Contents/_CodeSignature/CodeDirectory: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalidOnly.bundle/Contents/_CodeSignature/CodeDirectory -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalidOnly.bundle/Contents/_CodeSignature/CodeRequirements: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalidOnly.bundle/Contents/_CodeSignature/CodeRequirements -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalidOnly.bundle/Contents/_CodeSignature/CodeRequirements-1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalidOnly.bundle/Contents/_CodeSignature/CodeRequirements-1 -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalidOnly.bundle/Contents/_CodeSignature/CodeSignature: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedInvalidOnly.bundle/Contents/_CodeSignature/CodeSignature -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedOldED.bundle/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleInfoDictionaryVersion 6 | 6.0 7 | CFBundlePackageType 8 | BNDL 9 | CFBundleSignature 10 | ???? 11 | CFBundleVersion 12 | 1.0 13 | CFBundleIdentifier 14 | org.sparkle-project.Sparkle.SUUpdateValidatorTestBundle.CodeSignedOldED 15 | SUPublicEDKey 16 | OLDKEYw769W2/6/t+oM1ZxgjBB93BfBKMLO0Qo1etQs= 17 | 18 | 19 | -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedOldED.bundle/Contents/_CodeSignature/CodeDirectory: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedOldED.bundle/Contents/_CodeSignature/CodeDirectory -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedOldED.bundle/Contents/_CodeSignature/CodeRequirements: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedOldED.bundle/Contents/_CodeSignature/CodeRequirements -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedOldED.bundle/Contents/_CodeSignature/CodeRequirements-1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedOldED.bundle/Contents/_CodeSignature/CodeRequirements-1 -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedOldED.bundle/Contents/_CodeSignature/CodeSignature: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedOldED.bundle/Contents/_CodeSignature/CodeSignature -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedOnly.bundle/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleInfoDictionaryVersion 6 | 6.0 7 | CFBundlePackageType 8 | BNDL 9 | CFBundleSignature 10 | ???? 11 | CFBundleVersion 12 | 1.0 13 | CFBundleIdentifier 14 | org.sparkle-project.Sparkle.SUUpdateValidatorTestBundle.CodeSignedOnly 15 | 16 | 17 | -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedOnly.bundle/Contents/_CodeSignature/CodeDirectory: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedOnly.bundle/Contents/_CodeSignature/CodeDirectory -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedOnly.bundle/Contents/_CodeSignature/CodeRequirements: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedOnly.bundle/Contents/_CodeSignature/CodeRequirements -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedOnly.bundle/Contents/_CodeSignature/CodeRequirements-1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedOnly.bundle/Contents/_CodeSignature/CodeRequirements-1 -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedOnly.bundle/Contents/_CodeSignature/CodeSignature: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedOnly.bundle/Contents/_CodeSignature/CodeSignature -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedOnlyNew.bundle/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleInfoDictionaryVersion 6 | 6.0 7 | CFBundlePackageType 8 | BNDL 9 | CFBundleSignature 10 | ???? 11 | CFBundleVersion 12 | 1.0 13 | CFBundleIdentifier 14 | org.sparkle-project.Sparkle.SUUpdateValidatorTestBundle.CodeSignedOnlyNew 15 | 16 | 17 | -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedOnlyNew.bundle/Contents/_CodeSignature/CodeDirectory: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedOnlyNew.bundle/Contents/_CodeSignature/CodeDirectory -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedOnlyNew.bundle/Contents/_CodeSignature/CodeRequirements: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedOnlyNew.bundle/Contents/_CodeSignature/CodeRequirements -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedOnlyNew.bundle/Contents/_CodeSignature/CodeRequirements-1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedOnlyNew.bundle/Contents/_CodeSignature/CodeRequirements-1 -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/CodeSignedOnlyNew.bundle/Contents/_CodeSignature/CodeSignature: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SUUpdateValidatorTest/CodeSignedOnlyNew.bundle/Contents/_CodeSignature/CodeSignature -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/DSAOnly.bundle/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleInfoDictionaryVersion 6 | 6.0 7 | CFBundlePackageType 8 | BNDL 9 | CFBundleSignature 10 | ???? 11 | CFBundleVersion 12 | 1.0 13 | SUPublicDSAKeyFile 14 | test-pubkey.pem 15 | CFBundleIdentifier 16 | org.sparkle-project.Sparkle.SUUpdateValidatorTestBundle.DSAOnly 17 | 18 | 19 | -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/EDOnly.bundle/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleInfoDictionaryVersion 6 | 6.0 7 | CFBundlePackageType 8 | BNDL 9 | CFBundleSignature 10 | ???? 11 | CFBundleVersion 12 | 1.0 13 | SUPublicEDKey 14 | rhHib+w769W2/6/t+oM1ZxgjBB93BfBKMLO0Qo1etQs= 15 | CFBundleIdentifier 16 | org.sparkle-project.Sparkle.SUUpdateValidatorTestBundle.EDOnly 17 | 18 | 19 | -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/None.bundle/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleInfoDictionaryVersion 6 | 6.0 7 | CFBundlePackageType 8 | BNDL 9 | CFBundleSignature 10 | ???? 11 | CFBundleVersion 12 | 1.0 13 | CFBundleIdentifier 14 | org.sparkle-project.Sparkle.SUUpdateValidatorTestBundle.None 15 | 16 | 17 | -------------------------------------------------------------------------------- /Tests/Resources/SUUpdateValidatorTest/resign-all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | here=$(dirname "$0") 4 | cd "$here" 5 | 6 | codesign -f -s - -i org.sparkle-project.Sparkle.SUUpdateValidatorTestBundle.CodeSigned -r='designated => identifier "org.sparkle-project.Sparkle.SUUpdateValidatorTestBundle.CodeSigned"' CodeSignedOnly.bundle CodeSignedBoth.bundle CodeSignedOldED.bundle 7 | 8 | codesign -f -s - -i org.sparkle-project.Sparkle.SUUpdateValidatorTestBundle.CodeSignedNew -r='designated => identifier "org.sparkle-project.Sparkle.SUUpdateValidatorTestBundle.CodeSignedNew"' CodeSignedOnlyNew.bundle CodeSignedBothNew.bundle 9 | 10 | for invalidBundle in CodeSignedInvalid.bundle CodeSignedInvalidOnly.bundle; do 11 | cp -rf CodeSignedOnly.bundle/Contents/_CodeSignature ${invalidBundle}/Contents 12 | echo ${invalidBundle}: copied code signature from CodeSignedOnly.bundle 13 | done 14 | -------------------------------------------------------------------------------- /Tests/Resources/SparkleTestCodeSignApp.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SparkleTestCodeSignApp.aar -------------------------------------------------------------------------------- /Tests/Resources/SparkleTestCodeSignApp.dmg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SparkleTestCodeSignApp.dmg -------------------------------------------------------------------------------- /Tests/Resources/SparkleTestCodeSignApp.enc.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SparkleTestCodeSignApp.enc.aar -------------------------------------------------------------------------------- /Tests/Resources/SparkleTestCodeSignApp.enc.dmg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SparkleTestCodeSignApp.enc.dmg -------------------------------------------------------------------------------- /Tests/Resources/SparkleTestCodeSignApp.enc.nolicense.dmg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SparkleTestCodeSignApp.enc.nolicense.dmg -------------------------------------------------------------------------------- /Tests/Resources/SparkleTestCodeSignApp.tar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SparkleTestCodeSignApp.tar -------------------------------------------------------------------------------- /Tests/Resources/SparkleTestCodeSignApp.tar.bz2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SparkleTestCodeSignApp.tar.bz2 -------------------------------------------------------------------------------- /Tests/Resources/SparkleTestCodeSignApp.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SparkleTestCodeSignApp.tar.gz -------------------------------------------------------------------------------- /Tests/Resources/SparkleTestCodeSignApp.tar.xz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SparkleTestCodeSignApp.tar.xz -------------------------------------------------------------------------------- /Tests/Resources/SparkleTestCodeSignApp.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SparkleTestCodeSignApp.zip -------------------------------------------------------------------------------- /Tests/Resources/SparkleTestCodeSignApp_bad_extraneous.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SparkleTestCodeSignApp_bad_extraneous.zip -------------------------------------------------------------------------------- /Tests/Resources/SparkleTestCodeSignApp_bad_header.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SparkleTestCodeSignApp_bad_header.zip -------------------------------------------------------------------------------- /Tests/Resources/SparkleTestCodeSign_apfs.dmg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SparkleTestCodeSign_apfs.dmg -------------------------------------------------------------------------------- /Tests/Resources/SparkleTestCodeSign_apfs_lzma_aux_files_adhoc.dmg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SparkleTestCodeSign_apfs_lzma_aux_files_adhoc.dmg -------------------------------------------------------------------------------- /Tests/Resources/SparkleTestCodeSign_pkg.dmg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/SparkleTestCodeSign_pkg.dmg -------------------------------------------------------------------------------- /Tests/Resources/signed-test-file.txt: -------------------------------------------------------------------------------- 1 | Hello World! 2 | -------------------------------------------------------------------------------- /Tests/Resources/test.pkg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkle-project/Sparkle/8e30a08291cef3618eaa1de0797f8dfd4473fa0c/Tests/Resources/test.pkg -------------------------------------------------------------------------------- /Tests/Resources/testappcast_minimumAutoupdateVersion.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | For unit test only 5 | 6 | Version 3.0 7 | 3.0 8 | 2.0 9 | 10 | 11 | 12 | Version 2.0 13 | 2.0 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Tests/Resources/testappcast_phasedRollout.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | For unit test only 5 | 6 | 7 | Version 3.0 8 | desc 9 | Sat, 26 Jul 2014 15:20:11 +0000 10 | 3.0 11 | 2.0 12 | 13 | 86400 14 | 15 | 16 | 17 | 18 | Version 2.0 19 | desc 20 | Sat, 26 Jul 2014 15:20:11 +0000 21 | 2.0 22 | 23 | 86400 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Tests/Resources/testnamespaces.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | For unit test only 5 | 6 | Version 3.0 7 | Sat, 26 Jul 2014 15:20:12 +0000 8 | https://sparkle-project.org/#works 9 | 10 | 11 | 12 | Version 2.0 13 | desc 14 | Sat, 26 Jul 2014 15:20:11 +0000 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Tests/SparkleTests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleSignature 16 | ???? 17 | CFBundleVersion 18 | 1.0 19 | SUEnableAutomaticChecks 20 | 21 | SUEnableSystemProfiling 22 | 23 | SUPublicDSAKeyFile 24 | test-pubkey.pem 25 | 26 | 27 | -------------------------------------------------------------------------------- /UITests/.swiftlint.yml: -------------------------------------------------------------------------------- 1 | # Inherits from top level config 2 | disabled_rules: 3 | - force_try 4 | - force_cast 5 | -------------------------------------------------------------------------------- /UITests/UITests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Vendor/bsdiff/bscommon.h: -------------------------------------------------------------------------------- 1 | /* 2 | * bscommon.h 3 | * Sparkle 4 | * 5 | * Created by Mayur Pawashe on 5/16/16. 6 | */ 7 | 8 | #ifndef BS_COMMON_H 9 | #define BS_COMMON_H 10 | 11 | #include 12 | #include 13 | 14 | u_char *readfile(const char *filename, off_t *outSize); 15 | 16 | #endif 17 | -------------------------------------------------------------------------------- /Vendor/bsdiff/bspatch.h: -------------------------------------------------------------------------------- 1 | /* 2 | * bspatch.h 3 | * Sparkle 4 | * 5 | * Created by Andy Matuschak on 1/11/10. 6 | * Copyright 2010 Andy Matuschak. All rights reserved. 7 | * 8 | */ 9 | 10 | // So that we can use this method in SUBinaryDeltaApply.m. 11 | // Silences the GCC warning that the prototype doesn't exist. 12 | int bspatch(int argc, const char * const argv[]); 13 | -------------------------------------------------------------------------------- /Vendor/ed25519-sparkle/alterations.txt: -------------------------------------------------------------------------------- 1 | Files removed: 2 | ed25519_32.dll 3 | ed25519_64.dll 4 | test.c 5 | 6 | Retrieved source: git@github.com:sparkle-project/ed25519.git 7 | Branch: master 8 | Commit: 7fa6712ef5d581a6981ec2b08ee623314cd1d1c4 9 | -------------------------------------------------------------------------------- /Vendor/ed25519-sparkle/license.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015 Orson Peters 2 | 3 | This software is provided 'as-is', without any express or implied warranty. In no event will the 4 | authors be held liable for any damages arising from the use of this software. 5 | 6 | Permission is granted to anyone to use this software for any purpose, including commercial 7 | applications, and to alter it and redistribute it freely, subject to the following restrictions: 8 | 9 | 1. The origin of this software must not be misrepresented; you must not claim that you wrote the 10 | original software. If you use this software in a product, an acknowledgment in the product 11 | documentation would be appreciated but is not required. 12 | 13 | 2. Altered source versions must be plainly marked as such, and must not be misrepresented as 14 | being the original software. 15 | 16 | 3. This notice may not be removed or altered from any source distribution. 17 | -------------------------------------------------------------------------------- /Vendor/ed25519-sparkle/src/fe.h: -------------------------------------------------------------------------------- 1 | #ifndef FE_H 2 | #define FE_H 3 | 4 | #include "fixedint.h" 5 | 6 | 7 | /* 8 | fe means field element. 9 | Here the field is \Z/(2^255-19). 10 | An element t, entries t[0]...t[9], represents the integer 11 | t[0]+2^26 t[1]+2^51 t[2]+2^77 t[3]+2^102 t[4]+...+2^230 t[9]. 12 | Bounds on each t[i] vary depending on context. 13 | */ 14 | 15 | 16 | typedef int32_t fe[10]; 17 | 18 | 19 | void fe_0(fe h); 20 | void fe_1(fe h); 21 | 22 | void fe_frombytes(fe h, const unsigned char *s); 23 | void fe_tobytes(unsigned char *s, const fe h); 24 | 25 | void fe_copy(fe h, const fe f); 26 | int fe_isnegative(const fe f); 27 | int fe_isnonzero(const fe f); 28 | void fe_cmov(fe f, const fe g, unsigned int b); 29 | void fe_cswap(fe f, fe g, unsigned int b); 30 | 31 | void fe_neg(fe h, const fe f); 32 | void fe_add(fe h, const fe f, const fe g); 33 | void fe_invert(fe out, const fe z); 34 | void fe_sq(fe h, const fe f); 35 | void fe_sq2(fe h, const fe f); 36 | void fe_mul(fe h, const fe f, const fe g); 37 | void fe_mul121666(fe h, fe f); 38 | void fe_pow22523(fe out, const fe z); 39 | void fe_sub(fe h, const fe f, const fe g); 40 | 41 | #endif 42 | -------------------------------------------------------------------------------- /Vendor/ed25519-sparkle/src/keypair.c: -------------------------------------------------------------------------------- 1 | #include "ed25519.h" 2 | #include "sha512.h" 3 | #include "ge.h" 4 | 5 | 6 | void ed25519_create_keypair(unsigned char *public_key, unsigned char *private_key, const unsigned char *seed) { 7 | ge_p3 A; 8 | 9 | sha512(seed, 32, private_key); 10 | private_key[0] &= 248; 11 | private_key[31] &= 63; 12 | private_key[31] |= 64; 13 | 14 | ge_scalarmult_base(&A, private_key); 15 | ge_p3_tobytes(public_key, &A); 16 | } 17 | -------------------------------------------------------------------------------- /Vendor/ed25519-sparkle/src/sc.h: -------------------------------------------------------------------------------- 1 | #ifndef SC_H 2 | #define SC_H 3 | 4 | /* 5 | The set of scalars is \Z/l 6 | where l = 2^252 + 27742317777372353535851937790883648493. 7 | */ 8 | 9 | void sc_reduce(unsigned char *s); 10 | void sc_muladd(unsigned char *s, const unsigned char *a, const unsigned char *b, const unsigned char *c); 11 | 12 | #endif 13 | -------------------------------------------------------------------------------- /Vendor/ed25519-sparkle/src/seed.c: -------------------------------------------------------------------------------- 1 | #include "ed25519.h" 2 | 3 | #ifndef ED25519_NO_SEED 4 | 5 | #ifdef _WIN32 6 | #include 7 | #include 8 | #else 9 | #include 10 | #endif 11 | 12 | int ed25519_create_seed(unsigned char *seed) { 13 | #ifdef _WIN32 14 | HCRYPTPROV prov; 15 | 16 | if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { 17 | return 1; 18 | } 19 | 20 | if (!CryptGenRandom(prov, 32, seed)) { 21 | CryptReleaseContext(prov, 0); 22 | return 1; 23 | } 24 | 25 | CryptReleaseContext(prov, 0); 26 | #else 27 | FILE *f = fopen("/dev/urandom", "rb"); 28 | 29 | if (f == NULL) { 30 | return 1; 31 | } 32 | 33 | fread(seed, 1, 32, f); 34 | fclose(f); 35 | #endif 36 | 37 | return 0; 38 | } 39 | 40 | #endif 41 | -------------------------------------------------------------------------------- /Vendor/ed25519-sparkle/src/sha512.h: -------------------------------------------------------------------------------- 1 | #ifndef SHA512_H 2 | #define SHA512_H 3 | 4 | #include 5 | 6 | #include "fixedint.h" 7 | 8 | /* state */ 9 | typedef struct sha512_context_ { 10 | uint64_t length, state[8]; 11 | size_t curlen; 12 | unsigned char buf[128]; 13 | } sha512_context; 14 | 15 | 16 | int sha512_init(sha512_context * md); 17 | int sha512_final(sha512_context * md, unsigned char *out); 18 | int sha512_update(sha512_context * md, const unsigned char *in, size_t inlen); 19 | int sha512(const unsigned char *message, size_t message_len, unsigned char *out); 20 | 21 | #endif 22 | -------------------------------------------------------------------------------- /Vendor/ed25519-sparkle/src/sign.c: -------------------------------------------------------------------------------- 1 | #include "ed25519.h" 2 | #include "sha512.h" 3 | #include "ge.h" 4 | #include "sc.h" 5 | 6 | 7 | void ed25519_sign(unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key, const unsigned char *private_key) { 8 | sha512_context hash; 9 | unsigned char hram[64]; 10 | unsigned char r[64]; 11 | ge_p3 R; 12 | 13 | 14 | sha512_init(&hash); 15 | sha512_update(&hash, private_key + 32, 32); 16 | sha512_update(&hash, message, message_len); 17 | sha512_final(&hash, r); 18 | 19 | sc_reduce(r); 20 | ge_scalarmult_base(&R, r); 21 | ge_p3_tobytes(signature, &R); 22 | 23 | sha512_init(&hash); 24 | sha512_update(&hash, signature, 32); 25 | sha512_update(&hash, public_key, 32); 26 | sha512_update(&hash, message, message_len); 27 | sha512_final(&hash, hram); 28 | 29 | sc_reduce(hram); 30 | sc_muladd(signature + 32, hram, private_key, r); 31 | } 32 | -------------------------------------------------------------------------------- /bin/old_dsa_scripts/sign_update: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | set -o pipefail 4 | if [ "$#" -ne 2 ]; then 5 | echo "Usage: $0 update_archive_file dsa_priv.pem" 6 | echo "This is an old DSA signing script for deprecated DSA keys." 7 | echo "Do not use this for new applications." 8 | exit 1 9 | fi 10 | openssl=/usr/bin/openssl 11 | version=`$openssl version` 12 | if [[ $version =~ "OpenSSL 0.9" ]]; then 13 | # pre-10.13 system: Fall back to OpenSSL DSS1 digest because it does not like the -sha1 option 14 | $openssl dgst -sha1 -binary < "$1" | $openssl dgst -dss1 -sign "$2" | $openssl enc -base64 15 | else 16 | # 10.13 and later: Use LibreSSL SHA1 digest 17 | $openssl dgst -sha1 -binary < "$1" | $openssl dgst -sha1 -sign "$2" | $openssl enc -base64 18 | fi 19 | -------------------------------------------------------------------------------- /generate_appcast/Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "SUStandardVersionComparator.h" 4 | #import "SUConstants.h" 5 | #import "SUErrors.h" 6 | #import "SUUnarchiver.h" 7 | #import "SUBinaryDeltaUnarchiver.h" 8 | #import "SUBinaryDeltaCreate.h" 9 | #import "SUBinaryDeltaApply.h" 10 | #import "SUBinaryDeltaCommon.h" 11 | #import "SUSignatures.h" 12 | #import "SUCodeSigningVerifier.h" 13 | #import "SPUInstallationType.h" 14 | #import "SUFileManager.h" 15 | #import "ed25519.h" 16 | -------------------------------------------------------------------------------- /generate_keys/Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "SUConstants.h" 4 | #import "SUErrors.h" 5 | #import "SUSignatures.h" 6 | #import "ed25519.h" 7 | -------------------------------------------------------------------------------- /sign_update/Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "SUConstants.h" 4 | #import "SUErrors.h" 5 | #import "SUSignatures.h" 6 | #import "ed25519.h" 7 | -------------------------------------------------------------------------------- /sparkle-cli/SPUCommandLineDriver.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUCommandLineDriver.h 3 | // sparkle-cli 4 | // 5 | // Created by Mayur Pawashe on 4/10/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class SUUpdatePermissionResponse; 14 | 15 | SPU_OBJC_DIRECT_MEMBERS @interface SPUCommandLineDriver : NSObject 16 | 17 | - (nullable instancetype)initWithUpdateBundlePath:(NSString *)updateBundlePath applicationBundlePath:(nullable NSString *)applicationBundlePath allowedChannels:(NSSet *)allowedChannels customFeedURL:(nullable NSString *)customFeedURL userAgentName:(nullable NSString *)userAgentName updatePermissionResponse:(nullable SUUpdatePermissionResponse *)updatePermissionResponse deferInstallation:(BOOL)deferInstallation interactiveInstallation:(BOOL)interactiveInstallation allowMajorUpgrades:(BOOL)allowMajorUpgrades verbose:(BOOL)verbose; 18 | 19 | - (void)runAndCheckForUpdatesNow:(BOOL)checkForUpdatesNow; 20 | 21 | - (void)probeForUpdates; 22 | 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | -------------------------------------------------------------------------------- /sparkle-cli/SPUCommandLineUserDriver.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUCommandLineUserDriver.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 4/10/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | SPU_OBJC_DIRECT_MEMBERS @interface SPUCommandLineUserDriver : NSObject 15 | 16 | - (instancetype)initWithUpdatePermissionResponse:(nullable SUUpdatePermissionResponse *)updatePermissionResponse deferInstallation:(BOOL)deferInstallation verbose:(BOOL)verbose; 17 | 18 | @end 19 | 20 | NS_ASSUME_NONNULL_END 21 | --------------------------------------------------------------------------------