From ab7e5e69665dcfd4383091cd8bdfde9f46c5a591 Mon Sep 17 00:00:00 2001 From: Chris Moeller Date: Tue, 2 Jun 2015 00:34:50 -0700 Subject: [PATCH] Updated Sparkle framework --- Frameworks/Sparkle/CHANGELOG | 39 + .../Configurations/ConfigCommon.xcconfig | 5 +- .../Configurations/ConfigFramework.xcconfig | 2 + .../ConfigFrameworkDebug.xcconfig | 2 + .../Configurations/ConfigRelaunch.xcconfig | 1 + Frameworks/Sparkle/LICENSE | 3 + Frameworks/Sparkle/README.markdown | 7 +- .../AppIcon.appiconset/icon_128x128.png | Bin 24479 -> 15615 bytes .../AppIcon.appiconset/icon_128x128@2x.png | Bin 56302 -> 38179 bytes .../AppIcon.appiconset/icon_16x16.png | Bin 3995 -> 754 bytes .../AppIcon.appiconset/icon_16x16@2x.png | Bin 5822 -> 2112 bytes .../AppIcon.appiconset/icon_256x256.png | Bin 56302 -> 38179 bytes .../AppIcon.appiconset/icon_32x32.png | Bin 5822 -> 2110 bytes .../AppIcon.appiconset/icon_32x32@2x.png | Bin 10872 -> 6076 bytes Frameworks/Sparkle/Resources/Screenshot.png | Bin 0 -> 45473 bytes Frameworks/Sparkle/Resources/Sparkle.png | Bin 17441 -> 10794 bytes Frameworks/Sparkle/Sparkle.podspec | 2 +- .../Sparkle/Sparkle.xcodeproj/project.pbxproj | 92 +- .../xcschemes/Distribution.xcscheme | 2 +- .../xcshareddata/xcschemes/Sparkle.xcscheme | 2 +- .../Sparkle/Sparkle/Autoupdate/Autoupdate.m | 43 +- Frameworks/Sparkle/Sparkle/SUAppcast.h | 14 +- Frameworks/Sparkle/Sparkle/SUAppcast.m | 50 +- .../Sparkle/Sparkle/SUAutomaticUpdateAlert.h | 8 +- .../Sparkle/Sparkle/SUAutomaticUpdateAlert.m | 22 +- .../Sparkle/Sparkle/SUAutomaticUpdateDriver.h | 2 +- .../Sparkle/Sparkle/SUAutomaticUpdateDriver.m | 23 +- .../Sparkle/Sparkle/SUBasicUpdateDriver.h | 3 +- .../Sparkle/Sparkle/SUBasicUpdateDriver.m | 93 +- .../Sparkle/Sparkle/SUBinaryDeltaApply.h | 2 +- .../Sparkle/Sparkle/SUBinaryDeltaApply.m | 191 +++- .../Sparkle/Sparkle/SUBinaryDeltaCommon.h | 63 +- .../Sparkle/Sparkle/SUBinaryDeltaCommon.m | 145 ++- .../Sparkle/Sparkle/SUBinaryDeltaCreate.h | 17 + .../Sparkle/Sparkle/SUBinaryDeltaCreate.m | 462 +++++++++ .../Sparkle/Sparkle/SUBinaryDeltaTool.m | 428 ++++---- .../Sparkle/Sparkle/SUBinaryDeltaUnarchiver.m | 6 +- .../Sparkle/Sparkle/SUCodeSigningVerifier.h | 4 +- .../Sparkle/Sparkle/SUCodeSigningVerifier.m | 89 +- Frameworks/Sparkle/Sparkle/SUConstants.h | 29 - Frameworks/Sparkle/Sparkle/SUErrors.h | 44 + .../Sparkle/SUGuidedPackageInstaller.h | 35 + .../Sparkle/SUGuidedPackageInstaller.m | 139 +++ Frameworks/Sparkle/Sparkle/SUHost.h | 2 +- Frameworks/Sparkle/Sparkle/SUHost.m | 37 +- Frameworks/Sparkle/Sparkle/SUInstaller.h | 11 +- Frameworks/Sparkle/Sparkle/SUInstaller.m | 111 ++- Frameworks/Sparkle/Sparkle/SULog.h | 5 +- Frameworks/Sparkle/Sparkle/SULog.m | 11 +- .../Sparkle/Sparkle/SUPackageInstaller.m | 6 +- .../Sparkle/Sparkle/SUPipedUnarchiver.m | 124 +-- Frameworks/Sparkle/Sparkle/SUPlainInstaller.h | 2 +- Frameworks/Sparkle/Sparkle/SUPlainInstaller.m | 21 +- .../Sparkle/SUPlainInstallerInternals.m | 12 +- .../Sparkle/Sparkle/SUScheduledUpdateDriver.m | 12 +- .../Sparkle/Sparkle/SUStatusController.m | 2 +- .../Sparkle/Sparkle/SUUIBasedUpdateDriver.h | 2 +- .../Sparkle/Sparkle/SUUIBasedUpdateDriver.m | 24 +- Frameworks/Sparkle/Sparkle/SUUnarchiver.h | 6 +- Frameworks/Sparkle/Sparkle/SUUnarchiver.m | 16 +- .../Sparkle/Sparkle/SUUnarchiver_Private.h | 4 +- Frameworks/Sparkle/Sparkle/SUUpdateAlert.h | 9 +- Frameworks/Sparkle/Sparkle/SUUpdateAlert.m | 16 +- .../Sparkle/SUUpdatePermissionPrompt.m | 9 +- Frameworks/Sparkle/Sparkle/SUUpdater.h | 12 +- Frameworks/Sparkle/Sparkle/SUUpdater.m | 41 +- .../Sparkle/SUUserInitiatedUpdateDriver.m | 10 - .../Sparkle/Sparkle/SUWindowController.h | 2 +- .../Sparkle/Sparkle/SUWindowController.m | 11 +- Frameworks/Sparkle/Sparkle/Sparkle.h | 1 + Frameworks/Sparkle/Sparkle/Sparkle.pch | 1 + .../en.lproj/SUUpdatePermissionPrompt.xib | 2 +- .../fr.lproj/SUAutomaticUpdateAlert.xib | 2 +- .../Sparkle/fr.lproj/SUUpdateAlert.xib | 2 +- .../pt_BR.lproj/SUAutomaticUpdateAlert.xib | 2 +- .../Sparkle/pt_BR.lproj/SUUpdateAlert.xib | 14 +- .../pt_BR.lproj/SUUpdatePermissionPrompt.xib | 8 +- .../Sparkle/pt_BR.lproj/Sparkle.strings | 20 +- .../sv.lproj/SUAutomaticUpdateAlert.xib | 8 +- .../Sparkle/sv.lproj/SUUpdateAlert.xib | 25 +- .../sv.lproj/SUUpdatePermissionPrompt.xib | 11 +- .../Sparkle/Sparkle/sv.lproj/Sparkle.strings | 20 +- .../tr.lproj/SUAutomaticUpdateAlert.xib | 4 +- .../Sparkle/tr.lproj/SUUpdateAlert.xib | 2 +- .../tr.lproj/SUUpdatePermissionPrompt.xib | 10 +- .../Sparkle/Sparkle/tr.lproj/Sparkle.strings | 10 +- .../uk.lproj/SUAutomaticUpdateAlert.xib | 7 +- .../uk.lproj/SUUpdatePermissionPrompt.xib | 10 +- .../Sparkle/Sparkle/uk.lproj/Sparkle.strings | 14 +- .../Sparkle/zh_TW.lproj/Sparkle.strings | 2 +- .../project.pbxproj | 283 ++++++ .../Sparkle Updated Test App/AppDelegate.h | 15 + .../Sparkle Updated Test App/AppDelegate.m | 27 + .../Base.lproj/MainMenu.xib | 52 + .../Sparkle.appiconset/Contents.json | 64 ++ .../Sparkle.appiconset/icon_128x128.png | Bin 0 -> 15615 bytes .../Sparkle.appiconset/icon_128x128@2x.png | Bin 0 -> 38179 bytes .../Sparkle.appiconset/icon_16x16.png | Bin 0 -> 754 bytes .../Sparkle.appiconset/icon_16x16@2x.png | Bin 0 -> 2137 bytes .../Sparkle.appiconset/icon_32x32.png | Bin 0 -> 2112 bytes .../Sparkle.appiconset/icon_32x32@2x.png | Bin 0 -> 6076 bytes .../Sparkle Updated Test App/Info.plist | 36 + .../Sparkle Updated Test App/main.m | 6 + .../Resources/SparkleTestCodeSignApp.zip | Bin 0 -> 1346234 bytes .../Sparkle/Tests/Resources/test archive.zip | Bin 0 -> 190 bytes .../Tests/Resources/test.sparkle_guided.pkg | Bin 0 -> 4956 bytes Frameworks/Sparkle/Tests/SUBinaryDeltaTest.m | 913 +++++++++++++++++- .../Sparkle/Tests/SUCodeSigningVerifierTest.m | 176 ++++ Frameworks/Sparkle/Tests/SUInstallerTest.m | 65 ++ .../Sparkle/Tests/SUPipedUnarchiverTest.m | 70 ++ .../Sparkle/Tests/SUVersionComparisonTest.m | 58 +- Frameworks/Sparkle/Vendor/bsdiff/bsdiff.c | 137 +-- Frameworks/Sparkle/Vendor/bsdiff/sais.c | 534 ++++++++++ Frameworks/Sparkle/Vendor/bsdiff/sais.h | 59 ++ 114 files changed, 4256 insertions(+), 1001 deletions(-) create mode 100644 Frameworks/Sparkle/Resources/Screenshot.png create mode 100644 Frameworks/Sparkle/Sparkle/SUBinaryDeltaCreate.h create mode 100644 Frameworks/Sparkle/Sparkle/SUBinaryDeltaCreate.m create mode 100644 Frameworks/Sparkle/Sparkle/SUErrors.h create mode 100644 Frameworks/Sparkle/Sparkle/SUGuidedPackageInstaller.h create mode 100644 Frameworks/Sparkle/Sparkle/SUGuidedPackageInstaller.m create mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App.xcodeproj/project.pbxproj create mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/AppDelegate.h create mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/AppDelegate.m create mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Base.lproj/MainMenu.xib create mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/Contents.json create mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/icon_128x128.png create mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/icon_128x128@2x.png create mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/icon_16x16.png create mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/icon_16x16@2x.png create mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/icon_32x32.png create mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/icon_32x32@2x.png create mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Info.plist create mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/main.m create mode 100644 Frameworks/Sparkle/Tests/Resources/SparkleTestCodeSignApp.zip create mode 100644 Frameworks/Sparkle/Tests/Resources/test archive.zip create mode 100644 Frameworks/Sparkle/Tests/Resources/test.sparkle_guided.pkg create mode 100644 Frameworks/Sparkle/Tests/SUCodeSigningVerifierTest.m create mode 100644 Frameworks/Sparkle/Tests/SUInstallerTest.m create mode 100644 Frameworks/Sparkle/Tests/SUPipedUnarchiverTest.m create mode 100644 Frameworks/Sparkle/Vendor/bsdiff/sais.c create mode 100644 Frameworks/Sparkle/Vendor/bsdiff/sais.h diff --git a/Frameworks/Sparkle/CHANGELOG b/Frameworks/Sparkle/CHANGELOG index 985d84d94..d8896f4a4 100644 --- a/Frameworks/Sparkle/CHANGELOG +++ b/Frameworks/Sparkle/CHANGELOG @@ -1,3 +1,42 @@ +# 1.10.0 + +* Massive improvements to the BinaryDelta tool (Zorg) + - Ability to track file permissions (Zorg) + - Nicely formatted log output (Zorg) + - Numerous bug fixes in handling of symlinks, empty directories, case-insensitive names, etc. (Zorg) + - Refactored and modernized code (Zorg) + - libxar is no longer weak-linked (C.W. Betts) +* Double-check the code signature of the the app after installation (Isaac Wankerl) +* Added headless guided package installation (Graham Miln) +* Added ability to inject custom HTTP headers in appcast request (Mattias Gunneras) +* Changes to make unarching more reliable (Zorg, Kornel Lesiński) +* Have Sparkle build a framework module (C.W. Betts) +* Stdout used for non error outputs (JDuquennoy) +* French locale update (Kent Sutherland) + +# 1.9.0 + +* Added SUUpdater delegate method for failures. (Benjamin Gordon) +* Make the error definitions public (C.W. Betts) +* Add support for lzma compressed tarballs (Kyle Fuller) +* Back to SKIP_INSTALL=YES by default (Tony Arnold) +* Properly set install names and rpaths for targets (Jake Petroules) +* Use Library/Caches rather than app support directory (Kornel Lesiński) +* Check for a modal window being onscreen before trying to put up the Sparkle prompt (Alf Watt) +* Fixed crashes on 10.7 (Chris Campbell, Ger Teunis) +* Fixed Sparkle tags parsing (Tamás Lustyik) +* SULog code cleanups (Kevin Wojniak) +* Make sure CFBundleVersion is a semantic version number. (Jake Petroules) +* Replace typedef enums with typedef NS_ENUM to make Swift happier (C.W. Betts) +* Fix warnings under Xcode 6.1 relating the SUUpdateAlert XIB (Tony Arnold) +* Prefer string constants to strings (Jake Petroules) +* Use Info.plist keys instead of macros (Jake Petroules) +* Only export public symbols. (Jake Petroules) +* BinaryDelta: avoid crash with bad paths (Jake Petroules) +* Fixing Swedish translations (Erik Vikström) +* Turkish localization fixes (Emir) +* Proofing of Ukrainian localization (Vera Tkachenko) + # 1.8.0 * New SUDSAVerifier based on up-to-date OS X APIs (Zachary Waldowski) diff --git a/Frameworks/Sparkle/Configurations/ConfigCommon.xcconfig b/Frameworks/Sparkle/Configurations/ConfigCommon.xcconfig index 477cf7463..d8a107054 100644 --- a/Frameworks/Sparkle/Configurations/ConfigCommon.xcconfig +++ b/Frameworks/Sparkle/Configurations/ConfigCommon.xcconfig @@ -15,7 +15,7 @@ SPARKLE_AUTOMATED_DOWNGRADES = 0 SPARKLE_NORMALIZE_INSTALLED_APPLICATION_NAME = 0 SPARKLE_VERSION_MAJOR = 1 -SPARKLE_VERSION_MINOR = 8 +SPARKLE_VERSION_MINOR = 10 SPARKLE_VERSION_PATCH = 0 SPARKLE_VERSION = $(SPARKLE_VERSION_MAJOR).$(SPARKLE_VERSION_MINOR).$(SPARKLE_VERSION_PATCH) @@ -35,6 +35,7 @@ CLANG_ENABLE_OBJC_ARC = YES CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES +CLANG_ENABLE_MODULES = YES CLANG_WARN__DUPLICATE_METHOD_MATCH = YES CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES CLANG_WARN_DOCUMENTATION_COMMENTS = YES @@ -73,4 +74,4 @@ GCC_WARN_UNUSED_VARIABLE = YES WARNING_CFLAGS_EXTRA = -Wno-custom-atomic-properties -Wno-implicit-atomic-properties // Turn on all warnings, then disable a few which are almost impossible to avoid -WARNING_CFLAGS = -Wall -Weverything -Wno-empty-translation-unit -Wno-unused-macros -Wno-gnu-statement-expression -Wno-receiver-is-weak -Wno-arc-repeated-use-of-weak $(WARNING_CFLAGS_EXTRA) +WARNING_CFLAGS = -Wall -Weverything -Wno-empty-translation-unit -Wno-unused-macros -Wno-gnu-statement-expression -Wno-receiver-is-weak -Wno-arc-repeated-use-of-weak -Wno-auto-import -Wno-cstring-format-directive $(WARNING_CFLAGS_EXTRA) diff --git a/Frameworks/Sparkle/Configurations/ConfigFramework.xcconfig b/Frameworks/Sparkle/Configurations/ConfigFramework.xcconfig index e8e9d867d..ca9b25b63 100644 --- a/Frameworks/Sparkle/Configurations/ConfigFramework.xcconfig +++ b/Frameworks/Sparkle/Configurations/ConfigFramework.xcconfig @@ -9,3 +9,5 @@ FRAMEWORK_VERSION = A INFOPLIST_FILE = Sparkle/Sparkle-Info.plist GCC_PREPROCESSOR_DEFINITIONS = $(inherited) BUILDING_SPARKLE=1 OTHER_LDFLAGS = -Wl,-U,_NSURLQuarantinePropertiesKey +SKIP_INSTALL = YES +DEFINES_MODULE = YES diff --git a/Frameworks/Sparkle/Configurations/ConfigFrameworkDebug.xcconfig b/Frameworks/Sparkle/Configurations/ConfigFrameworkDebug.xcconfig index 58d6b5aa6..184b8a7d4 100644 --- a/Frameworks/Sparkle/Configurations/ConfigFrameworkDebug.xcconfig +++ b/Frameworks/Sparkle/Configurations/ConfigFrameworkDebug.xcconfig @@ -1,2 +1,4 @@ #include "ConfigFramework.xcconfig" +// Unit tests need access to non-public classes +GCC_SYMBOLS_PRIVATE_EXTERN = NO diff --git a/Frameworks/Sparkle/Configurations/ConfigRelaunch.xcconfig b/Frameworks/Sparkle/Configurations/ConfigRelaunch.xcconfig index 1537a724f..292437c93 100644 --- a/Frameworks/Sparkle/Configurations/ConfigRelaunch.xcconfig +++ b/Frameworks/Sparkle/Configurations/ConfigRelaunch.xcconfig @@ -4,4 +4,5 @@ INFOPLIST_FILE = Sparkle/Autoupdate/Autoupdate-Info.plist PRODUCT_NAME = $(SPARKLE_RELAUNCH_TOOL_NAME) SKIP_INSTALL = YES ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon +CLANG_ENABLE_MODULES = NO OTHER_LDFLAGS = -Wl,-U,_NSURLQuarantinePropertiesKey diff --git a/Frameworks/Sparkle/LICENSE b/Frameworks/Sparkle/LICENSE index f91fce3df..f4020f8d3 100644 --- a/Frameworks/Sparkle/LICENSE +++ b/Frameworks/Sparkle/LICENSE @@ -30,6 +30,9 @@ EXTERNAL LICENSES bspatch.c and bsdiff.c, from bsdiff 4.3 : Copyright (c) 2003-2005 Colin Percival. +sais.c and sais.c, from sais-lite (2010/08/07) : + Copyright (c) 2008-2010 Yuta Mori. + SUDSAVerifier.m: Copyright (c) 2011 Mark Hamlin. diff --git a/Frameworks/Sparkle/README.markdown b/Frameworks/Sparkle/README.markdown index 912b6ee3f..0e557c536 100644 --- a/Frameworks/Sparkle/README.markdown +++ b/Frameworks/Sparkle/README.markdown @@ -1,7 +1,8 @@ -# Sparkle -is an easy-to-use software update framework for Cocoa developers. +# Sparkle [![Build Status](https://travis-ci.org/sparkle-project/Sparkle.svg?branch=master)](https://travis-ci.org/sparkle-project/Sparkle) -[![Build Status](https://travis-ci.org/sparkle-project/Sparkle.svg?branch=master)](https://travis-ci.org/sparkle-project/Sparkle) +An easy-to-use software update framework for Cocoa developers. + +Sparkle shows familiar update window with release notes ## Changes since 1.5b diff --git a/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_128x128.png b/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_128x128.png index cab9bc5aeb433d4f032629ea08bb018d58f5b1a0..4d7985201d08d85342b12171ac3bbe1757936135 100644 GIT binary patch literal 15615 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 AWdHyG diff --git a/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_128x128@2x.png b/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_128x128@2x.png index ea89c0608eea263e6ea0ec31ae73afb0c1b7266c..2bf2b0b8a04a3052a4688638386f97a169dc3d4b 100644 GIT binary patch literal 38179 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 diff --git a/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_16x16.png b/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_16x16.png index dea3255ce1300b75539c210b1596e7b2b85cd19a..23eada4e0d6b91b9cbc09ed80ef9727a75cc5564 100644 GIT binary patch delta 731 zcmV<10wn#LAMyo|BYy(9NklUoHNu)6D0e>zhG~#S*Po$aG&N;}`mh56)j` zzY?%I=)c7EcDsGh zWxqnN(+Z<+L1<7PND*Koz)3)cz}C}(fmfm1A(>A56x!^8L1wpCi|*4tT&X(^8qJbv zW+u~P1^7DmhD-r50^$T@3EsT1pp6wYo-Nbx`)}_n)2Bf0t1JnBq)xe`oLt z$M=mEL+h0ityW0XTL@FOyuB&@tIng29;h)9>Qqlrs6Q2|Pk?SC)~po&RlNpHD;P9C z{JG|^FuCTi5Xqp)_9vApRnZs!hpDlimbz~Berh^ZdRMPnK~4OP?*J+Uz#Af&9O?i7 N002ovPDHLkV1kgCcuN2P literal 3995 zcmZ8j2T&8r)(#M)N>MrpAyRB4NR<*g1Qewz37t>_gdi;-y$gbLLPx5Cf+#4xci|Fg zMnu2}p?8puJiPC|JOBJUb9T?3`ObIFx3jaeG5QbS7wLKE0RX^79c>N6^Ofa~(Ox*8 z1$NGC004Sbw7R;!j=DNX-vjG_cC`lpv@hnSyPY=+bH1CU|UT#hVU>Hk#3tszo*?mLz6re=R&tpA-yx5 zb=r%ZnOLYLPB?A^5*q;eCt<)2F9b!1Q~`o*eWl&}(&d4!eM&AC3MK?a8_B@|2tUxE z96M=-WoEw8?y25ehlJQQPTp$O7xDaZ7Mui@RTsJdpw}FiQ4A8{BvYmuRd;hsoB==W zrd^kax-G#`Kv(z%Jlplwb?@c;&Bp!=yvSSu4|0gRNh&X{QGYs1m{b%8EHKXy{^3{@ zKx5x*tdj*G?_V1oJ;>1oh_hu{4K9cjxW-6mvT?7+Y*PYgQ@iAvJeZyx$~ol$d`lhY zVu3L_s8Uv92AaIs=Ww)DZFGpbeKWQ5KIy5iE@8KZ@wqr>$Xjf>CWSB(lj)SSR>8Nn zhWs+`bl5sE!yjaH3hR4v{BTQTm5`?zmxr8jU3~*><^b#onPy+9Zb^FxsKH!NA(P(d zZGZsV)PS1loE`osSIgwCpNygm&sJAmJt^{CAU79fkMqN@pIW2j_A>|8j~^+Naw>;j z)nS*k*Cdy|EWM{OILOF^C)l0tvz*Pg$)W%1@4S_h-^RHWx%kjvF_kVN#;GwvU-PurPr7RVpDjHAumoGOyu zdL~Fb`Mq!?z+fKhM$%OU8_n-ACfIoh7vAD7nu&02r@WL%WKpJ->ptzf$;wJG%qMLZ5sFJ_wU>zhDkDX}jpoz!(Bo zp^s|6Cr&XPilz!+@&e}|2#TRkR`C0XV0v&bv18{y>z z>iV$Vt6n?}v=-q$MM{0jIOGEt?#M+@&5_@Uv;obzjcg4puY%?C|a?Z;*utXYO|`q$JE=#{gclQxHmgRF#^ zla=*TuZghf-R09%n|L61w_e3h#ZSG&@Zu}CF+_PrL$0Y_vqs?EKqx##62F6=?XO6A zo#c|Xg7+8JOC{oQcq>T0sFh&w-QT4rb(99}D(yz0MOBXqv`94_ut*)vtim+ZQ&biz z1{MBOy4ygwDLFK`_L5$i%2L&caETy~+GvU2NL|hS8u@Sb-^8!LWs8qTQFkB=&B)itd}JPS^(Vs%9pcspl7`$RaVc?)aS1z8^Yw&T!lcYwwB=dT^|ZqqZZ`tb zz-bO?6ln?Nx(~7AY~#7*m~y=_ac2={8|Mk<<8jFAc*08pE{~9FC3QA;61`m25c8z& z$oW_2GHf}8CyS?rhnwdi4_>NAnmfxat3QjJwIJ17<7CS40cc7#UHD)ro|d^jXzU_7Af@HvHkcsc1vm2Or$C% zS0`B~zW=__*Rg41>jpv%fzf5&NkrB8`_GSr4jWPeK)G}awZo! zbbaXJP!R(o=O*Wv7?;QJV^STTM-s#i5@+S>UNH7>GHup$S#Rpglm#9FgXL5FTazS{x3$Ups14_hmrC+VF-q}Dms@;VUI#)CY)&ap zeU7Gfh?@&X#A7|+9pD?fMfzf(7Vr^`5`zTYC2DVAXFElEW0(MR#7f9~jDu3`MBOJ+ zkxrV?g8j&o3vx^9jmWBB-9z6XUmQ>jrKzFb)u^4&H_``x7SC~y1E2$hLe z?a0SB_<04c%&?rrT<$0%>sIbs)#J!OVoGE5aq>dX&4u_aiv#Qp>t)aiK#``CCi4({z6C89Mp`e3ERY0-L#N|i8ez!rHaJW z8$O}O*B@RkR2fdvz2=E@Xv}#2TlbfCoKUuKIFg~-`Tevb+&=%4!657W?p)TK+rX9n zo&Mt>X$NVXw_}UX@2Hb@>2(*TipVdO=9Bdga2D+iq+cy72^bJYdt!4yYarg9cg8Jt zdd%R3K~;;jQ}xDtk6OK&0jXJR$c)Lg+m+pQZOWm#!g&%8wjBP28u%IeQ&0GN^2!V{ z(ByDxa4%x5xn!^8827`67WaK>sbL3^i9%XVe6IXqQ9&NuF5IqdG+AwVWMlT&ni-v7 zmrx_|>V5Owx6bhKm&?V=p*#s$^UcftwQITGdMAmkGnn8}ig>DS8YO-4;D6c{lsG7km2S zm%9Ju*Gu}6MfC^3JA!gsKYI@ZHu4x1C;Vaq%a=q?^Y=b}HjOnc`11Wr%*SFGw7;(Z z%u>i`?vOIOPn~zT(;$J&f%2_A`<_0#eMV-cf;cv`Kw^|KCFMZg+G%vYVpQg`N zJa3^6TsX2ghEDG_1d^YhQJyKuA)Y4Ja^{0>_RoIV|zdJy;1ry zcKUUT@?Pj^!LjXbZ_?7L-hp0Pe!Ma+fbL}5R|MlQKeHdPb1Wf`3_AZ)(z$CRJpllQ z%YTdlkd?y)08luhjS*gm`?~VBSPaC*4vVsf_+s48(Exy=ul%`-vG=k8`C?q%Jmr01 z;J*>_=l-8C6b$+s;^hJZBkt>i)Uh7+AZdscL>#O{4+4P{J?tFh4K=j>Nk8Agz)oIX z?($G54u^x_Bq3N2N9b)iIXS4f1XMyo>>MHH>F4HU<16OodG)^}|KriH_q6puyL+Lr zZlFKBHYlvO7Yq#kQ|RCEPoEg~e+#*J{-f$#AJo^z9eNug4*i$;JW=snqrAF@y^R;v z!x)QoRZ{(P2q1kYtQXeP3F{7$g@`Lc|3B!Ts*2D*t^A+X{;T`%=(%tu`t!{H9ikF_ z7yI=W0033Ij)to79aeiojH{777i@pJc1`{X(XGTMce24}N>o6yN*Co&O?#&7S2-u``iD>|7gDdQ=ZZrtd7Rg~=})kh#7%lG%J$cz$7vw5zy9{NTM(R+XI zhMNVWq~GM-c`Q=g&?@P@7?|bCSPJkTUMwdJE%&j`f7qUnp2zF; zbeSlpOgQVwsO@{oualimO$wp>KMu(OE6Vi7nVnM#!g-Ns>w1-N>mSx6Z>a+d1q_43 zt_4N92ahqgwj(f(^IH?3zrfVMx@Oazmj)u_7;0_^$S1wSOl=@mcq3bvWEG9Pqq%^u z9#g~|ODwx`9#f3cQ{ZJ;??lHGs0VD2D+lbySInBpo=%f2)B`!-c&6g_3R^2q*GmhT zv`0^yv8!A&M&=4Cfg-fbV9AV!D>BU6jmoZHuT{=W?u9Q_WKcpAr!#MZI<39lXyuAV zq)YF!a8RX(PPC2oFLlk~^Z5hYDu0(9!n5*@yV0ESwF1L&q)V$iSE%zFsJr^E%_>?8 zgb%`EW=Y{(mae;>7^fLz*Rk!JR@o7yZDsppN`jHIarC8^dL=icI0Gme(OhiQZDk?S zVFfzMEe#WqUByvk?$7H86S)iyo9&`H@G#**X*hSkSyK4wRjV8+6uTf+QcxNmrgcsD zQb`gvlQA0n&@hAT_hMJ!IR7;dw`-3^Lc+7P>`50-6A&~wi%F_dv03CVp#aVBtSs%V zSZBdt0D5_W?)5iZx~EAh>VZVfE0lk2DKEqH3O~amDcq_;w$e7`%|Zm4GCZdnvXzTH zZf%`DJFNGj1s7Z~RRJLHtc5`9x}EOv@G;{)T$9744*ap)wkCl9^A`lPl4` zt)i zv17J5-FG(vBBp@lCtw(p=CFaq=pqY|zY#GJBx^Deq;ONFiPuZsBHdT*H(@eOIG{-` zINhE){^Eyg?Me)775Fe)W?azy+qxnFiQq4N- EKSUUEW&i*H diff --git a/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_16x16@2x.png b/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_16x16@2x.png index 0e7f543e3147efc5949c576ffb5fa7a0e2aa8668..fa1e0dacdb6058bdbb640d6232c7b1af718570b6 100644 GIT binary patch delta 2100 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�y3Kn48zRGCPXH!T^=8}VLo^@(z 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 diff --git a/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_32x32.png b/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_32x32.png index 77e8fde5542225c5596b8abfdddf3b85f4886d16..eb1d810a2457de7d0982528b3d4cb8b44643c0ff 100644 GIT binary patch delta 2098 zcmV-22+jAtExr(tBYy}5NklO0176 zR*?b@SgC{3Db_&>K1M|gw$;M40#+;I;}3~N6sV#Dqhh6%Dk9ZJMR`a>2@pdHBmoSN z$7Wx5@7{Y(g>20Hopb*gk#$~O)o4wY1`zO!4 zZ_ZlQx%8DckDSeyu=0<`rrc1~v3kxrRXyw3%%+=`bu8NQ-jN~vyR2O?L|i#<^P^*` z()x*Sf`8x)O#A7w1&7LSyMMqp!H^n}y`=$93l8u0m^Wb2^c${O@`8?EXx#kd zg5|plr_3%I1cvzM`>qnyzn93&wB}s;i+O85_)3ANpBP)Zr1sVQBgaL;hM~`B?7D(T zQ{#a()33d#=0N#5^WR&wId7x@sp$y<(vINxYj3@|{(qK-CX76PlcpO?da!Xv`M6MV zB%C;^L2FQe?$$L;2nPhVDjIqsTCw&>?CipzPoPgKk`5>rw9ZC=FhEK{${Ky~mhA2lFDdX`a6QlpP!hW>?s)czPI@5eLI1$Et;vq4r#%Ce*61`~gW*8X2U;3b zl0J!?%eMCZS`0(M+fRO>624$a$Mt>_o;`sL35oMnpqz48)cxZvy^73np z$}PF{TVcOL*b;;S5-TVX+GJ4Qz1(x{8x$0};5C76r*A=szGfXC9vFt!IamTrLt_XR zDFunRL%;akU#?pD?uWe^!(aV;=*SIw7CvY7pFE~-PC|wPE|I)eDu?aoy2}pIuc#1G z&wqfs3jnNH;2Xv6+Bh#)kEXtHIMHN~gzYC97is^=2iM&5qYbxTGqX9}D*=Gb>jq8s z_nZ7eX<0!i+mZ2_f3JP>DE?|av=&xpuYp8Ks%rTEkL={G!JF@;rY2oeFZZU9>nTd{D1u= z*RQ$jlGyFzF0YIM2moOX8&*E=-K}Mp74-{+!6!AA0TMwGhq+_OeH7<)g7!cIUL4x? zLi`vApl~z~0_{;^~sXbLY+vn%c8nr^8h#w3Mbs8ekaUCPA8DT7VzyJ{AC| zY;u7NU;zf;0TPswBwGU5t$&bAg6(KDpcH78t&xV*sbBK|TbWL@cApbFd^8x&FI8y; z*(nkN3<*{UJPV4fPeB4MU3fs4?0(Lk3VeP=U!#e1tQ;o+>3M#}D6Mdg7hBNqx0DCUg;*4J zCQoDlzE*);@qh82OiJS+@N5k-E1OcM31?;v%)ydeawYej%s!*9U zD2YY@WGxgjU}85vv#}=G*g!84^d3Z@?8>t7ufOCA4-F|dPB#MSi;z10*QTS@Qzzmj z_VFLXUwlpBc~yJLCe`SHllPxa>4fcG{@IJF!G9tDB`ZqJV95-t;Qadn`IQR|fBsYf c`TRffch`f*Mo_uC=>Px#07*qoM6N<$f&>`?w*UYD literal 5822 zcmZ8kWl$VU(q1gMySpX8;_kjcf+j2kch|+UxCD0y4k17mf|KCx5*!u@?k*v?9Jzb% z>Z@<6dZwrAX?eQlM^B{28zpQE3Jd@MfDKZX*Lptb{tDWQ=iS}c_W}UGkg=7M(*ViI z(P_9jTiH5T0szX`IcZ)x+Vdn4W3581;{*(J%oh~C=ya1}%EZW;k)S{g#PCoSPk9tY zB7F9D7CIdWN)Zg^3PhM8!Devub3Bc{PEC1*t)&=y^pkRd-^-Z~{dz0&JN58+>k}xv z37~NwjNAnQBLwmnfQgO|It>U2hkLFN$?yy#~tuO|;z~B?}s&(N9RLfQ!P$ppOifwA@ zI$I6EO_X6gvcpo~5Xq}RM1CB3jtD?Y=@Dsh!->8TvB?E^7h7*eAxDDDit*u}Y`1m? ztZvV0wQtOLUZr%uUi;{+Hg-{m6~|2)Sm~UmfWWNhm|>H6R8Dntq&K^5bJIS*LgTOf zATi*3_x6nCa4c6QCRcC8;qV)~6fq@P7y+m`wkQ0MqUdTZ^Q`UxH290gFfoc)_7 z+`%ZRXB~?bGy3q*!5tybp6k`F&|O}z^H6)Z$W_Mh@!dPIVp6FfMi4QdrNUNmNwKQ@ z$Oslr`k2MT72eZEhluUZ!ETQ1ybjW{u-&(syD8|Qkv7d?;z8g9E(?s%fSI)bGC@{U za{nBAA{!5505nWQqXC3E;4A@(vMxDx8niAa!u3dzUd58~oR9oR0ISb<8?7~!3&+z87-wrIhp zc*LJ&N)t%F;AY6q;!*0O`N+v=2ooXo%0(vNB}w0mvwS6c8B$sxry+5{2%%^~GYq-S zM;)i*fAN3-4aNV2IAw}G2lx>FpC4z97OBG81sVP&URYC%SGTy@)6<{X|C6N4^oE z7qe#e&UDsHg?r|c`KNbkq}zg4czi)O!9`{>)x}`eZ&IGm3F)(AVj+>Kd0a3BM zNhSh?Gm&aBv1il;>45AQ3|S;tTIrJqMJ<%v$n>O*)GL_s=!}_hlcY3K*jR|vRj3qX z=ii8^G)ntO`^Xh(VSja+2A6(n%F$PEm4~W8flA4I>A%xA2FsJn675qD(*2m#Q{d@d z>Bd}ntj6>KDv!nY4TzeZ(w*8tg;nng6xZsyB*H)nnV(b5KAL5kMVf`I3-oF-wOnTzNtWT%RJCL8Kr*NHAzE^t#T34OVnO5W?epxte~K(}PJe80uEMYTn- zRXe2hqKn()noow z&k)VzlscBGPjlO`*qPeR+uhA@mBo&gjCtjbE4&vPo~JE zXrmyfcuSGa-zPwx>6AH`xs|!Y-(P2=kNF*0e@lPoyAgM4#_@=b6?1L0NI`kUQ3>aS zx~iE{I=wP5SQH?^aLhDluSg=Fdt>b1RO)m4FDpmC+<2P*UTA96U!!E7U~y@^$DB*aE&^X+<4DY6`2D{0>uu#)}EVQ z)-h=ss~f|z-?m}lFB53)|6KJ;Pw$)JY`#dh_`rukpRAi#m=e+8=p2$I5@U`d4sFf@ z4q82SJruBG-G0?=_d-vmy`ed@KiqD^ymqvBY5RLQjB~}a{Rk?SX;`&H()^}*>=Nga z;g02w2UQ}%JE9fmY7XMb)*K3*!9UntYZyI?*+6CWW38S7m8|6Gjk1qoj}~HLk)D!H zbCS7DxUMx&xg~O0aK#vVyA({nT}<83Ke!!v4UgUN>~ZW_nvDlCaIQtqcmhHhn;R@Vs664L{wvh2N=V%C9xlqryJ~Qa!EB}<8U2g#pmjWSLE)s$LoLNwBs8yZH;b<(h_UXO7_|=!-~VPmXs?_QOnbs`I=R2CN{Mv z+kLW)vYKnHoTKk?9C{sy9gdc)YRl~w(;18={+JD~N3E+f|4KSo(Sz#VER9@-9<>%- z7TtNRdZKy#TH0&+4bCvrGnyZ-ST!u)8ae-bUf-;H*!Ir!y{ieXZM;Q%9q-qgR+UOS zrJ0ibFZ)3h@tNDL`+oIDISc)Z@b(qQfGLDnq+V1>8X~HefPpIw`*In_UejM|-@3;R zKJPcRTL%~i$R8=6C5|bDDHZj1#e2+%O~Zx03Z)2k#U}MtZ@Bh5KdkWki=eHan%~M^;8YIvC^e^4 z*3*ZJn9GdJ+97MzvBXj0>@1NyFaLAdzOb|CNYV&VU5I2;-R5LYMODS}a8P=s(OIJ# zY_aw3{%v}hb%ltb7&HgkdKCT;J4@4?n`V6IZ@c&X#IbeHrS>6hqdcw+1-f%^g$MZdT`=4$hMGWsR42VH)cK!xENNsaglKiE8&A8veR#ZZ5lTPjulFmnyJ zg0)^8=EF_KYCl@Xhd0OppHgos)w@x~U}LWo>lF8u%9X}qZeo^vt1o&_hhx&GHp1H3 zAAek>PL$>Od)>8Kn+^7y+D{y0NU1D;Z4#5M*xj7+vOOs-iCQjele!FgD7Z7f z=ug}`RKHeF&5M=t`hb3a?#<$8wY_o``umPoRL}o;rbKs9)^i5{FbV$(0w6P+3;;l| zw$%Ycz^~Or&7B>&Of8(vEV;ZLU7pbZfVj8lv+8IGF{Sf%bZ~MP^_F1xH$wDT|7!*^ z(ES?%v6o-~zt*6Wb9S?&6X4?K;%1PF(nMG4;aKrVECKpf9sz*9bNvH$jSX5R?qx^-li@<9xiU+{~|v-ia&D{m2 zhx#gzyo?SQJyjRoC3S}Q@p0=2=nO(bu0cZ&W#)*KmLAth8n_oBqnJ=Sy|=tr1biy6XV+@(jUU9)n40ePXQ;n zexr>$A9lp9Kxvk1!QH$7xdODU9=RkgHk{;h5|l8bw;zqbl8kO`eJGetiso|I%lh95 zvg~TPjJwcM}2x^C(V_zCYf zY=>-Kt6=?9{wh)J2-od-r&bAp8w=dQ2hcCOS5^!>+C-G04Eeg|>ND8FEmADyqWASB ziz@yQNBAL`5^NRUVQTjY6A#m0zhEw45vEYvMdwjO5v1tai ze>@8A#-^#xgAt~}Mr%b*r^uL4*6(ejTWw&m&TXpWf^jaqPrZ$&T_;KMOiu1r}t>Bre0mXZ?nmP;2RF1YwWu3iD2~%!8RGT zURr`nT-I%GTz2qe`lRNxWcJ^O>j-HVS@#ghu#wT zYpFb6G)b?Ib3ZzBi#bZ>tljc5zTjxf9!|&YPj)5$+0hN0`z3@}gM_&qdI>HEwv@0D zxR(>ou-uRMq-h5^%xe${fAp(-An+98BvTTJ&u^IP$l+TK(#Gg4m|OK4JZpenXu@wkj1x zZh3HaCz6$5yoyTT%%}8ZrsuH56U7Zt#w+|SNIx-!%}GB=yrU+g+Nb?^TKMV_a*)Q# zY9RP4kT>FTRHhP$&+J@MLtO=aW9)!7R(F+m6Cd0~Rli6h*O4C1N4G!Msm<4ysQxJv zsrBvF9dVFEN_B}DW0Xq?2u}va$xgi>;7Wiv9r;a%NGLg2j(X>#GCMnaXB6=( z9`gl@Y=?P^_x0|ZBiNkqmCT{c4}Ve#^@rS0*-vl%@)ywTgZPs#6sroF<7yd0aJ^M_ z16^Vo0&zNB z7j0UP;U{7k&!N*$Z*45Dh^K1mmfuCxo;_s==l$U@VXu$X2Ir$_K|xZQ~&gigP(oN`-eY|elr4= z72m;;A}(E@CTx3faCbjlj)Jy3_1qMb23*))co4Ned@fC{Er?P6;D0wcuBXictLdHG zFtt@B_4qlOsf8$v&n|6gLQNEgsrbqTLh2IA%vP!~qU{(ej@|s}MU9cWA0ALhBFJWU^rEZhmw8qyHB0}zRl6f;KA<_U?%kA5We%``du?AnP=gs;POmO#R} z8IvPq{8kDKE6tUW`}0Pf?gLYIM#eiCj6jtlp87B*7~E7>)3G}Bve306NB}38rY;=; zLZ6p$E*RO(r9(>@mWzh>I#W3TMS&lMGkQ6J`~$^oerHtoi54d#%zmjUgRXz@C6uv) z=uJ*TGC9gyo!r%ccJDPjC49bUZ4<3~4(UNi?28MZSGLh3|9G6toB>;`gqe8n_|#?)@qj5w4^IW1~+eAhk}La^DFZ8TGsfq;p{MK7h0j9_!Z@sy%bwAazhpm zaQG(%wa@)M3Ezw#Gnp0(hDvc^+wi=@3Rnw={eUxzo^Pm86r*buZi$2coYva~x)YgZ z8O|tjmgX=|{2M<*qet8C$K8 zRQ*BGdHjW?3YaD#GW=s4%Q=^v>{!*(AC4;;@12R?Cs7b#+1cbM z|8RB^f9r9gJ(z5tKH*`$-V@2;5ds;sA5CFTrWABCfZEr&dZ2u{=T#OI8@UV*6I!@h zg1XDx2?@YGp>y0KLVf*!EX-NGq_nl0M z#a|ow$Zn>gpsbwc4@OEyw4}hk^R3}Tm7;tMjol`k`o-9tT&l981wS`G508G&vpWR^ z8u5D*_In>uNrPibe6x_L4aFC|h#IX8dkWt_RxxGm?j=ds3!y|Ew=*`}Rrg*llsxL| zW-0S0!yL)pWrrL!KYWG3=%XXRjuvZ8O`;G8q{?Ew;oG{vfF3pzKvS107%#L)UZ{A< zzc-}cL0x>!bB~-T+D+m&twKurwUpUDfo~TE*VS0g&1LlKJS#LgJOG@&mTG!pt~$#$ zs$}iVJ0U$C)ng!m9*>W2y-c~hC4R8P{!z`Rx~}F66m=5aRUlazrlSI|qFO!3ARwd% z{mE9r;Skpvz8p;ByhRj<&S2piEYuX)n>2b~B9+njJN&_kgqIp`VT`u4VQT3I56w-3 zXc^>PMh3~Rm)2EFuUJ~R>BV%IvUL4x#Fil(mMy3e>2I>BvG9RhE7VYGjp6oY|4Tom z0h(BoO^r7ss{X#)$8L)2ceyJf`&W@X zP(fB;Wd5v+Ma4|AFBE1ZA^}YU~eF8h<|pAcZ&b J6|yG5{{l2V5H0`! diff --git a/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_32x32@2x.png b/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_32x32@2x.png index a3f6f7890d54f1529e38e8c6cb39bb5d405dd841..f44f9779822d5b6d66a8c87a3160dc9e674b331a 100644 GIT binary patch literal 6076 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
  • g9jS2AUi5e4RpWp#?wg346R~Cfy-1oU}0B_() zCTuz7BA!g1v*OW$EspF}#{x~XGQI=9t!AhQK)h<_@d{4y!=yT7B!K+zraqnmM7pow z$tGwxs8DM_6>q>)LlgrFTd!UD9N_m)z5(^e@noZ9uUc~XJ>OQF zR3nmVqXKfEwF@;L3nFrR9@#az`uNj;tvty{Hk;zfCO7F8&pLb6?e*O&7r3}s)BQ4S z3-Op#ir&?4{&vIYS6>fUo@AuEohP0CA*61`+3%fw<}Dw0HU>@nI4}s_1er1hrmW&j zn58)KuYp~+pL`kcH=Y8-L|L8+Ts%3iZNq;Z2D*=MkUI(dO2NitUH=#-14L)$? zcP4vp_$aU&;QurO1jqoVG%tDWJ6o2&?JS8JjmBdYBh=Mw-}~Va)?>m3iX&_G4*m1p zKPnDC^i5y*-2agVc+~-iMU6|I-L&Y6i|e{hUmB!4Qi!P;7V?BC@x-=~$)4Z;eSF8y zf33D~3(#9#!Tq0!00u|{vw?F>s`b5fou~f1apBAEYCh!6_ct$n{e9WF&$=nqe8e?K za5Zo|&pM^ptH_#&h0000 literal 10872 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 G_J074UVljd literal 0 HcmV?d00001 diff --git a/Frameworks/Sparkle/Resources/Sparkle.png b/Frameworks/Sparkle/Resources/Sparkle.png index 8ccf2e73486242da702c9a90c57a0e6c4fc00d82..13d59cd27b5849de524f93dda49369de84daae76 100644 GIT binary patch literal 10794 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

    K;UOHm2*3k>epb!mCx7*+VFCQarPP2}QH@s; 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 literal 17441 zcmZ5`18`+Qx9&MfCbn%(Y}e( z)(ilULdZ$=P*YvS44>)Z?3zU-C8oH?{Ru-n&ntxip&Th4pad2cLg_B{O#&T-M#EIC z7bqD{Y9fvf7aU}~0&|P3G~A~wCVsdHvVpm(X209Y{20;NUOjGES+%(GU1y$3<` zyJ`Xh*a|e!FVFgPQPCy_pTMw@fry&G-d%HZ2+3zLu*LT-{)~)rso}=QONIc`j&-^o zB}$j&FaHEmPEm450Ic{D2cI7$)*)E3YU2eF_ar7&8lI0Zid9(*40&+sCpa z+K#dGG|GblT&-!GPPSZ7htgIi#cmM@qChvDV#lJ$2g~-_&m? z&u4OlLAhGnw&%YXyD$Nd7=!v@WNis}Gq-94aU!Z0@gDGr?|I)5MHU||Hj$e)qx}}=| zz&DgzsZ|MIjwd(RPS!9~f#plxsdLTOb1y7@Z*kegLZ@_!coBBtQxoJQbWl3d~9fqCr^T z&%aNQ`47-N*xC`W82ED*LLrF55mFc8M=ydS9DIPJ5NueVEE8}m&_CFl;rfsz$NKd50CXQ)$`RuBHi=$scHaikY# z58u(R6kEx_Hww92-Vhwp7u>l2AqM%YTH6^;D48FL?ssgu6n~;}~ zmuQI!Lb?5-W@UPNj<#Z#n6Hd4qhu0m+FjcISaniWf=$Xv#r z%xCF)E0}VhP@igGQJqGC#BNhRf2g#0W?_nPgmI>Eq;c>b`;an4XJTMt3#wv;&}rQ~ zMF|P6$U=$Nd~1_@6VIC28WVveXYt!Y(&^AW(Mi`mj2VTQ&LQ<7{vqyRkvo%P!1i_U9{#tkJ@RMktM$XcU;e*IxS6=!xH!1#xM^&| z>^PbBnPZuUna6A+O_thl%@Ep$+Q-fMOeq-3aXKP}W7}NGD3ijLED1S=>@HY@cbGfwwub zq-3jN?-(hp+tAYbC9#~(J-|2WQ{GV5W_piSJ05^}b2tbm`_%b9Dv%wtLToFK?z^-6m#-LdVP_;v?xBa zum}idVTG?58Y>RcEom4tJf0}6ES9Z+xAggi^}=Rb=`)RjaNs*B5fkdyIu6t zI*7JIwivb-o92zx*6V4c`g0G)6MIp6iWD1(XWLr7KVCK`A44v>N*+tzJa*inJvKH^ z+wU|pjJ5PvXKQx!st+e`3vXLGew=q}80k0}B3Z?m#x=2&H+0F=T1zgK{Vo0*h#QxA z)b-c9`fxp;= z)J?*SWT<4xNPnE$67S*)XE|pwM}JJ>aQ(j1h{MOugQz!J)u|F|QQI>F7YX;x-pDi2 zRW3Z=s#lb6~ca_n^m&%*JsG z*_niCjO;A#JP*HHk>Svr=t!(^o*%9P?M(;sIW=`PTN8n4wfZ-0&K2ujZ|~}9RTeee zdc3|lzFik#A2G{>9l5Cn=YCeF%~y6^r;d#usr%Kj-QRqVU-jM?w;tPl4`aV_@W7)X zUoRQDy}$G~_)mSeKIWh*kn{y7e{y|Tewdu^7gE70e$TBGto~SfUNNuex59Lo3lF@mI21at8DQ+Wc96KXg3-N?X_u?VB{kr^UcWiocu;5{JRazFcRn;x{82C}}W^zB0aC)xzteBD) zBk17+^M30|X=i@4{Sfmff%+A2Zz(gtlOH546=WJ@uqar5pKjQ!1_(?5YT^)HC89h8a7(7@R9Goo} znYp>S8JSoZSy<@*A?RJa>|KpK>Fr&}{#(ia)gxx+V&ZJ&=xXI)Py8RfM#c_quKc8= z|1tEx<$wINbNpXJ_AdX!>K{KwPa{W0W(Fq4|JD3YknbNy9#LmABUcA!H3tV<0pb4y zfmq4X!PUXV(!r6KlYxnk@&5}3Prdnz$3wy1nUzX@zF7Vk#gZn+k|wx3LhcotDEKzFJVNoE8f*_~ z_d{(qToE5RURVtsSuD9Cxq?1)em)Y>)qbH^I@4= zs&Rz5PwoT~y95wFJp0-MII znW!Hz9r8}<;Ue8qR?@L_JagD8vf=#}V~G^b^U_oVffMyC5_AD(6RBfUoZCKPd2pC? zQfNYQ8a2AKar`S>$JIH9Y0bF%Gt+d}a%0qTuN%Zmhs?q)QmCX653N(5zY9fgrfZt1 zl0EobKHq;IGjfsDx=gm7f)BUu$MTx4)aZfVnop(|%;>b(6U5JizuX;{U7wy>rwa15 zkv{Kv7r1P1{`gr><-hkXBs^?sprEoLP`8cXvqu{FSuDmQa?}0$Aog7B4iAoUMPPMl zw(WJnLJliV(4iMwboXwb=>(=QR!Iks=PO@A$F!yU@~wBt;qx zq!Y=X?ud-hd-8skq84tO;kB;FFVDlW^;G%pFGa!kW%X~gf=`TT1%(7*gHU3zOxOcY zL8zp2B@M=3}K?O_2^ zLcdUBiswNYy{q{EdXO95{BOl#_lG0(qz(U$Pm2~)yNsS|4eXr@syiY(tz z?b(a{RQa}=4@7C#!=t+m3mo!qUAB`R)Yq(1GAp+E!v zxatGGYm2ea+x0acqbQr*{JOg*@@18D`sf(2@_f?17x5tad*#J~II43DkpNWo&GxCOBk569q zUCL12b++U7zB(MMEQ?IyUQmTHpHEn8B;2=vOBGgt{1RDJQAp_ zwR*nV-8I_W&!xaHG)(zM++xcD{v5hJ?{sVgUXUC>?*{;n!81Q#(7d&zqezvZbAHl* z$p5c{>U2gOwTr6?A329%1XVz~6>=48fF;lf%0i%WS$RL6xE=x;UteE4XTteb&>m+8FR%+UM5FCSW#J%Ewi@!3NC#Y916x6LdG2Iaum-VcK zGwQR)48b5q4KvFQ8zrQR@ALCaSEaFX-*@|Q#{Z~odvRqZTZeKUA@cO3{DfPW{H>2H zo>xO+4T4XDJvA`t^w(WmaZ#5fLub=!2giH(wmc8sBqMk|@obJ!1lG|kIPY0ls(pNHSuwQQdDd~59xdhIk>r4LW*;J&j5 zXG^9BpW|O!m+>zDU+Hj1;dDpdECui<3!)oLVQ`+vkoyHQqaJ8X0eECek$;xIbp{jBc7{ z%t8HZQ2mQ6EksA*Yi4LPv$oCE5$sbIc-a=xXi<1}n*!;~Op{2Im~siAi<%Dqw|<@d zaS9X#5w|g)wb64GYCo^Al z#P2BgaYg1q(}_t`bg^puw*y%YyoPQP#&N9hihz2IbZbt)nF2hxZIHd!*&%M*)7UDN z0^i+4i+L$8Pa9~Ak-A17Cl9tmfwwjAM;?-6XK?5(Z?nbz0x)l@`iS(D}S(Q30vKhn% z#vA$$be!RTkO$}&kpIJB>OjgjSLh=sPezh zd1j^p5iapRvh3I0*5;py9c_ONmzP~2SA_*RsWFK7Wzeukvex>2e6-1uZ;jkAt>B+< z>Kkx6Eq8yy)iPqoWPnpD1ELf+W{3DgC2<)B`okZjkwSXi0{en-F6oh<%2m6)M=k_m zymgQs4H*)j6T*#PiK|WMI%(6E$Ewa0GW9q6mk=0Op`{`OZVNaF;<^WG% zQ(WcD&KT`lKaA8ppwt8t{y`2{Vh#oqE-T|*4aYV+5%#3B!1{Df&|E~-mp@S5m%3($ z%UgN({mG4gu+tg3oDS28`Tln#j^-BmJlyjFo1U3o9@SDRLV0Pd=5Iq7K(4UK=IN@vaGckc{mXZrVXpPhvK7ZIJ^6_o5cw4f}&YbLTCaEp!;RK zMTY`6i@PrkXOaa?Iww_zx>+Q$F+`*=Md^TM|K?;6T*=i@LavbDYDknfh{paRe;1`5 zzjPW2>T@wtF%J#@$qs#sTID*e-eT&f<+)BZComBC-Fq*Dm5>D=&Jq6kRmljurN1=X_zzHS@Z=jkXDx;O7(rd)n?LJkO>fiMgjJ7QvUr`7R`j828ApQLWmTF zU19-Q49!)Gu$Cg@2BqtgLb<1d2WWY78-vWjr*43ccuUxRbM)qwnC=`_yy0`3&vdFm zgC=C84FD0?%{mZjR^YqD^lF1;zrn9nk;T` zNJ%f7t_m8POH4r){;9yM1Zpf5NE7fA9<72mIpSeRu9X&DOa?l;<~zJBaRovBfX{IL zT4fyDS`fS?1z=5@-i=IAUf}N>{+unj(VGh&z4PBic4|Jfn9+CbSvY$sw0vA919QcS zRAn6A*`5jO34vZ$tPpt-1Slky1UU~!3jv`N=ogUNQSsD3sz7K0@mB30b9fHt~sDuq35@c~?)WzgxvTuos9YZFCH3>eW zLk*CH#s@BgWx6}BqN#A#K$xVhO^yh)mn%IHBQMZ;9a4=JR!T0ODXT&cyA+K!3nA?p zjv%bL1hJrg14W|snKv+ODdeV>&4~}w-Z9f{6lu-`nnx0pGvEvrWhR9GOYKp)oJ8^8 zoDYQBZCZ9Tr%;+UK?J-~YxTJTJnl)EP+O;3NXFLu@*qOsz@Izx#n47f{+YmD`33q6 zi8vqkM-#65SA3Q=Cc`v#YF-VJ*>q7NpW_KCiypd{zF^dFBH1UDuQK2yu49SSUTb?R zna2B{l$hGR<6@km*a25|9geBuo}NR3&iKn3-X~Q_eJPvXK=O_uBD*MNi3*2PsgL*u!spEvEH1o+sGuX7?0+E;Y5(?__w={j(#2PMP}L@b!?uS2esnnD z-!Nh&6Q}&TT=QC42+E;)hbM-4vje~64oD}5mJJe8?L$%@ne0=*1i*frj3Di0C=#tf z>0EqkH6qhZztgn=o2N9;^T|2*(RWX7_*H@epn8V}DnU0{P%A=^H=e^ee`IXO`#7+h z2O+Tn9foHa)?vIqoF{L2GB zB$H0fK%sZjAlPsb5j|`(3UuGr-cir_Xz^B6drjB2Y|n8Bxer!g-3MedQAnxQ!+;eo z>m>pc9IA`y`{a=GKF$xR*(KsR@(=*lXp9qAF4p8d3Vt>duqdbM-LEivTcQ?AM-Jk$10dW2dd&lnU2We%@e`N7*Lls<`{&@Td4Hu74lrNe zW_|kI&-Cu=Y2tAa29pHxp`8VI!~UJ84eDYwmpMHl%uw~=tYL>NF7<66tgmTRzSLNN ziGj3{hG$>z-J8Za0mR<2Rl6Dfgx_G071Jiw!>je;+WzXh!}9t4>(b>Ii}KdF&nx$_ z&5-irSPLKbXnQ{%=VusCh=~3EuLb8Mf!Z>w)iYiLyLB)5Sh=?c3@#k_IUmnaTT4t} zd)ybYOZYerpgMZ)7?KuMy5)JtTw&Z_Re<%b#d(6O|B|_UDl6;cA1}y(V<)0y_q4=(Z9X~S_zD0<8NBf&g9^A z#HqP++Xx@)yXLqb&$D7e_Z*u&V71M&Mk%ieI(RD1A5kC*$_?(n?#{7N! zqoy&nwPagIPHSA|Ldb`6~Unun!e7eyW~-AiDw3i_|q zijp(4>1PBM6P4QMsG|Vb4FZs;_tHvukHZdWx^sBxH)&_n@?I7uc`OrlY|VIPyrB?e zW0RqrCp+%D^CjokF~KCe4u2Y(-;D8k2#qBLHibi;)OQ$$_ zw|EW&9FMoD&@X%s7eh@R8MCu+=xH8X8yby9Jh9EA9jO;%Q#^dY0679Z6V!Cq*o1Mr zJRfQv{?he5uU!v0v`=dOE&QlmhSDz~p?AY+=hql!OEUTz;UPi%iKj@iy(^5X8NMp% zSP4Ns>A_0eJUU?aRr&6we0F>|ij4y}LTk`UEI)BZPyv&$tq1`UHUZc0lfN2spPy9c81FA?|uuTk3 z5JNBQv4e!dCVJshK=7;?C`@k(_^KYtbCYnT5%tiMB2VoeP^3Q}g<>ERDpzOa4k>wp zyc*_Bd90jHoEA6zjueu{FVM*{V9^1Sq3V4ZzzP*|V$EOd8YaIeT+P}_nT~XbcC`>Y z83I*ia|*bFw+=!IFU3t(DwmS|r={fB+|Mvy{`0-nf3ml>5>uAha6QvW7(q5g{G zOD_1I$-2>oE*JxW8hmJoBKEWKQaY`o#=KFs$3@5?sHEx)%5;6(hPMy*M9q^{J5* zzy86Lx0?4Lt-2GJUC_o@A1Sk^DnCHiD_h8l(j^I1_jBR-pL((s z6vS{OIAXG3cL&1&4x8b=zjn7p2DUUlHy=dXnbiDOvO_N9ydCHh*aGf5b|(C$MTJ6b zUTdRz*I|FK4tD98U;2~RDH@*_4D~Ty_tMy}XO=7xhlB|(sr@yHKn4F!v~jITl>x0- zrc+#N6$y|mxdEF^F#A{b$zpGfx5w26$!0gaC5CjPy+6Y);B++rCh(#^c;}P23#yFf zT5>nLPpT9*ZiY=P-ao%SuXC>qv<;Nm*+a#cM%j-X9Xle0H$y}31p(M0<~MXVY>SQ}j_ZtX-Nn}IY^ zB5-3=*F!S7E1=N<{A7w7KUmo5k-qpR`cerlyl;{WHv*Nf^AV=RC# zvAtLHv3z_VF1uJW2?1<}8?|S4oPaEYA8Mx4Z)q*#n4xWtlXK%`=@zS|{T26K`aK*` z6t*|mW%bR^EAHLsrPZdveEYT+)F#oJ7TyT8c+}-SAh#$qc8=T(X zv41>1V^eiddA-C^@|RtWXUaISFYUW7UTo|iA=ita$n9P11e%jn^7;|l=hFegZkjO35FT1M3{ZU#518l(Q*Lt892*H@6AI=;Obb8%k*Ie5R?k+NdjHru>`qg!zupVdMM@9N0uavGf#FdX<@?TN>YDoticar4;hMljQ}1 zdWyhe6IJlmj>*hVQ=q~gGM0h%UIg!UvNF~Fkp3{I|I3c-Q`B4O*YlDRb>l@m*eI^c zRAE%3|Fcq`tM1DT#9f~&l3bj%;I+C~Kne>kKbrKJ*qlhLDa}kg5n!Y+5X|e>8#nW# z0d?bWwOGkFOF-7i9$mhXAnZ?{vXf*dC6;s$VI|L<6_%!ANl3(vGM4GG=$EuTs&M|V zq^_l$Tf_ak`3$YdiD|AXV~qPM{svkqyAd%_DyZ@F!C<{NAA+(-B z<_d8jlrJP|Thc6|evCO+OcSz}VYhwzqpXQtGoS8PrYpqvp}1zT92zy3N5A%Oz>lA} zK|W@o1hhO-RmP;H6~j)6p218*>S0y4zYO@5R-QgPm)o1&5Fr(^hbd`k9bO4I&EjY? z2jkLLnM*2LgC#d6d46zY+iW>eGc7P*C#-bf+?fjJ73{pnC#WvM6~5|*-kP2{lyq3} z)*bK!#21e{CKeTfm6gUxpJqJvb9U)>6=MT@`@oc z-dDnf2iD3Ekb-~g6qODB5U{?CyS$#&M}i$>!0;)+QRhx#>=FRrl@bIvxzc$8rDxh^ zw@yhh*1gWN%p?3*uuMyx3WNpi_ZLgnj{?c74$-x=J-T$W?~v1daKEo&xV20IVN8*! zCjulJx=`dKp*-;owxg8I~jMYicCEi$#Sgc-gZTfIT{e zvtR5(iTV}gqk6O~NMSO(R78q+cHI}9i!_wK<}?X{P{R}4%x`HT2DbvlSD13(@T(DX zLTAHRe#gK@pImAl2EQ5(Mkv68qu=DHNo6CgF}LDDPviV)ugWT$rw=|{5GF~?yQe6u z1U(Klh(B!9v}r7KkbD=59=pu;qT|)s3tB{-==j12gVUP-G-3|v*WOta3RC) zW0hgDB?v28EOi~E)i9R0IMb^WwQhv~GlBMEjU)+lB2|Dk(CvQTMZtWwZ$>Xkyeub6 zhwXRWi;^2$6g#!_^AIYrIyZm(4|c8EphlDuBzecJjK6h4@tw+Hth>cH>sF-G;=B^O zMuwNMZW72aYAPfFQBQA-DK3BgzrT1*DC1D2Sfr?P%l}!X?r&vbj2WyQ1 z{Ykj^NeF{mF&%$t^|qS;*?tVZS(3o;E_KMdujEia)T60+(Op0_&Pk%%VdTH+f}GCu zu(WT5rj)dM*rqDu^D!7D7k6h7g{fZlHi9X@xh2d$?~~?y@&TjjiutCboAw+#mD5>3 z+)-EJ5;&v`2aBTGMY&nF+)b@c{s7qLJSivU($mO3|F|1ML9M|Nh_yDps@$32UT%>P8 zM&;cP{d7jU4_H#U;)U~(2fKjSB>QP?26oT`j`TD{n5p4A7p>U`|1U)bMIa8r8IY8E zfq24e~&{032AQ=Bp%xSE-sIRp5d;M5CXVZOt6537-!!6AV5= z1HK5zX3pWUm91v{R(EIe%>tjPxWE~>i1xpre#Sz5E_q&9$ zO)jT3PXz%h4ZRRj8=dsjRzTb$pt)#t4_?I(51n~)?nhyx>=W)U|6jeIr^cwh45R3!Xqp-j z`NSDV03y_K+s$3$GhWE1ftBefv=w^4P0={&zBn$&*YT`{*kvRdz+pRozPJEy(;Ab6 z0c<&H+*t_)Lpb=i0OkF)2#^T)<^x#9q7^{9xCz(lT3OG1z7kA0h_UzjkZBD7r?wL$ zN1`0R+@deVisVKUz{OzgY<_}*$SXqy5hn@3!U?gH(4?R`XgTvE{O8(~a~RTDxE$DE zVe5quN`p?PN5t_?#?GtuXmn@!n@WCRI_`Lhh7O+@|Nw`JHSTIXWc_k6T|c za`^`cIGD6)y`sQFuMlH(%$-6*En85%I>6>Nw_U&B$0-YM3&d7h6&p$YSd_5=4_l@? zZtSWn&LYwOX4obXp=EAiRp!}bOrE?-4zZA_j~sb$!~QnS_^ZAXl5|1>BuH0>c){OH zNLaFCs6K`AilO ze6-rDwNq?`@yaW}6@U*i{bmDsope>R#EbfoW0b}j@`lhPTrMQ!i2cjzeXb*i+6AKb zJsFTbV_|MAr0&RTdrc7 zsy8c$$XLdJZ`bq!DfFsDqa|*O7Ob3VDn8% z8-*yV@>}zN?88?s&Bs$3w>zR};o;E!CbXn&+ohTDQGQf}ZA!{oB5wp#FmPl#1T&vQrnVD=RmT%PF34Vt zQSP!{1%5QRd~veZ+4!x59C4o<$jo_o`X+k~lbO4|xUbl%i>!F*6q!(0AX8(t_t(B6 zl%#>Hw#H%T!X)%2d==~2D;eaEVO4xg(n-aF1CT5zK^jS>jGiAJ*%oL|VDf{d{#h^j zW>Ez!wD%E0(q&E(KdYllPrZS{uVAq~RjSc}kYVdk8lTGVKECbndIt|oFt#4fds#~S zEsJI12?Rn|+E2rq!wT)i0ixxbAZwNRgShK=_(y5M(vl`yVt47~q4wvNQF@KO&k0~e z(4BEbkP#BoH{F^^Ic(Z^^FHxCQ>m4}@espf0ytpCF6hs?-Fq0l=ly?*Cfz3TMK*-y z)3-H}de{jw*%c&gG0up&ik#hqzyifw2GBTt63-lx8?yfnY$lSJCZlmd+?(2*xq7j_ z({smvctswC+<$q0*&ebntyPSR(iZnE@X-Do1a%}y;&xLze7}t!nzP2Knt00 z$QFU53}sw6bHun$rTXFWTl%)g5wXt-S8?PCnR57=z)akMmbM6E6L#ClZn+LJ(7cd%WwfjWG?0dbT>Tdo5TS!ux*^?@py~>IueI+og?iZ*q?96`H-`Ew91w z0zCEVP2JDv89CBD@~q8sb*(9R3#gTuh(>NV_)s-}1jiom5&wpL{vnT^f&!&uZvY*A zIXzw4Z1Cz^Y&XD4T?0A$*chzlAXOGinr>eA+Ms`a5$ksGY%?%^_w&|#!%14>a7fjw zJm~-q0sr78b8EMI{;etAb*{N6=QFDxiI&cA)Bh5Jj=^ zx0lYgm_J089bD*oS{qeo?6!5)cb)EelFmJqv2!XKptTtVS-2t_%m&OcdGH~Y!t9?@ zeeh)+m((Q#;w8z)AYlU-=e^tqJdi6R+)1V|{ryJ=>3kSpt{N&{jVspPb#Du$J?v;E zsxKnnXmj;Dxg11247~6DvI|<;^E}UkH9l`2;jOw%AUHt2LS5}KZBBD{#L8%M58Wj2 zoVW%m7^B(w_msHId|cfx^D7S5f}eleiBQ2qDI)7vqKv?RA(jlSgLC?^U10X$8&his zjh@RxtNEB=_1U>vw25Q3s%a_3Qb`=({7`mt_IvKKYtuL942e=(fAuojZjI+>a{b+b zR*|)$LH3fCx)u4|ZPbsDAg|iaHoyLZAJ*M>$FmR{okgvqt{_{nYWtMk-Z1E07d>QK z)d6@2maGZYWXWC6qfQfoQjF*Di(Qymlc>FxvmfsI`!bi){#QqLpLb9hTXb=!(XWaI z_#1f9RGB}zy4rucFN`BFZ%0zK!U^(kX0ci{@oJ*5@M*nckK*c@Kx0@e-E?POTE3OO zZiS@@oH+cnDY6=F`;%y~;Rviso-s24Wj8S;12iYc6~GnpaD|{Gew{k_*|6sKJHAMI z2Vs=t3R!jYnxKPt;RTLpF|Y04Y0>Q>Ki44RaH?m<6WbdqJ4NA+kDGIU6SMNzgGNRX zackiH=Ls&)SPk?&*1Vj05^MrGl<~pOFl1&c^pj!HBLHaH=%3e#-5c&qCh+E}!Y>TL zKFYv4{^)s#f*`Rsa`Nnyi^QihEI)G#yD`zmvfrFTA~lZcC7ku1!gaKSw3ae87k^s( zzdCeyaJT43sMgFbL9o5$U`XhQ3%Ff-XoH`n`m<}8S5Y(&BT{fM^{nB%Bz z|NGr#{kL6%(EubLBD^F9;8Psltb90Nv4HcJN`tOU8%#$)ZW5%go1g}Ok_KPrQD~{X zE!OW(sX+d|2289cG<1$s#380nzb3aV>6T+1!jUekF4wo_a3%t=M2T}Yv>YXcd5rFp ziA*`Xz!}Bu_$8F9e{AVF4Po4NY=2DawmOnD#KB9V1@L`7?^Aw_#q(Zus&4r{>BUzB zH>k>_2IUuf;SUQy7iS%y2Bzcn=qRZiFjK`MrK?g|V51Gc#LT1CqD;DWeE2m`W@u-1RQKl%Pk1LgTcx>FP4!nS)K7ySv*6-t|(a zDA}o5++Y|V38NHaU^y!KLS^OmwzHa!Nm<4&bglB8cO9r#*JmVNLYDZKcMqfMxTSQ) zu4g!}^Es%4E(9YW`((0ICm6pZ>+^#{N|UN+q7>;ng_)X z_Eafza*ZOe&$~lzD|#0C-WSa(%E}}N2wdj_uV^LF9AaFR0EW(M5ldvd2Aysflh9v! z9lh`SWDmEK(bWx3sx4l1vFje<3^^~;$lA#NF2MXtIh=(c36yRc_rRN36x}{1)0M66 zKSvjHJ{f^+pr_eanC}#T^#R0Y@J9*r(h)gUM=z5)$rYR+$(Yp`Odfy4E0eY|vz?sf z)UCpPk7Wv?{x2lkrC+(YqK!OTU-?_c_C%Y8cNq$K1yD1P5Ome`l%jFwLegkQ-w^pY4 zbH~IJ+<;BSj2aQ*BpT>JITpboPhLeFkZqP*reW?8>w@NC_f=OgZ0tul7?(Rn^6gfa%2xqG=?A6XzZkW`G ztAuO67auD4<4zuL+?`Vx>sT0KzyxbX@rc@ z&l05a2^AFiZOj`tdvRT2W9%A&Y0qA;7}z>&FqC)@o2hvfC}Ci!(gxEk_wq%(Vgl`& z)DGxn7_&=dUN)raeQ+fyUvA9K&<+@tCR-*q*Kal3cR!cjdmal_BIabs3ZLQH^Kw9@_X_p63|6KcO_R zb5SUl8|l=laH_Mbl!)WL_C8FiF>P;y?5uK^WO#KPuZWz z3`dVU7>)<~TJ*h12HXC58=m_ubz02P4c{4G>`(W~?B#9;z-)MmALK5WmSA#x#nxUi| zd^W6@SaFB07<70ir*kvQ@-8Y~RvLp-jujPe>!^m95ZPaL#0#?Au>F3_l6chl-vF0pSf&d*XxtCvF3g{6`Rmxd!~tW2WAX)h*QC z+||7P>kr1d_xIqK8@!1DxJknssT3d&CutVM5d*Xy^XzBMV>gE;tmL z@YVA|h66;Nll=Comm8^m=Xk_Pduw+BYpj zg^d8d&2vnT(->JFUHCW&fa*<7st}U#zOIfPKdr@u;dyXV=Vgxikf;H zuf;<>SJJmM*cC_HqrFYb>w0SbyeZuH#yjYbjNc7t0npE7qmKpifyZ$;u59(c7bpZW zhnG_6Cbq|Wt7|&8|73mVu3t{@g{F-6=g+C|WLEG6IbQAaBUsFdXlFlOj(1_^)JHou z@5jq>w%rHV58&+t`nJ@3hxz{$0GKg2I81S38h*S9(wE)U@N~9D+BX&f@{z|E5!{w@ zbHe(p%Y~J1h^Xnb^Zb^QjOQ5x1)B_oLZ;X2HCtO-@%Zrw9~U=Nx#7VV+~=QvzL}GQ z-*`Fv(wj_d1Z)Sq3wRUo3g896^EU8U;dQ_&0KJ?801AVz^|)vxmMmFfzV_N{=G3Y9 zHu+-|J}zs3vV=DW?z`_k!7mJ&ci(-tiR&CjV`C#VoC2Wy17|g^#23L=A}rs08f7a0000 +@interface TerminationListener : NSObject @property (copy) NSString *hostpath; @property (copy) NSString *executablepath; @@ -32,6 +32,7 @@ static const NSTimeInterval SUParentQuitCheckInterval = .25; @property (strong) SUHost *host; @property (assign) BOOL shouldRelaunch; @property (assign) BOOL shouldShowUI; +@property (strong) SUStatusController *statusController; - (void)parentHasQuit; @@ -57,6 +58,7 @@ static const NSTimeInterval SUParentQuitCheckInterval = .25; @synthesize host; @synthesize shouldRelaunch; @synthesize shouldShowUI; +@synthesize statusController; - (instancetype)initWithHostPath:(NSString *)inhostpath executablePath:(NSString *)execpath parentProcessId:(pid_t)ppid folderPath:(NSString *)infolderpath shouldRelaunch:(BOOL)relaunch shouldShowUI:(BOOL)showUI selfPath:(NSString *)inSelfPath { @@ -86,6 +88,7 @@ static const NSTimeInterval SUParentQuitCheckInterval = .25; - (void)dealloc { [self.longInstallationTimer invalidate]; + [self.statusController close]; } @@ -152,40 +155,40 @@ static const NSTimeInterval SUParentQuitCheckInterval = .25; [statusCtl beginActionWithTitle:SULocalizedString(@"Installing update...", @"") maxProgressValue: 0 statusText: @""]; [statusCtl showWindow:self]; + + [self.statusController close]; // If there's an existing status controller, close it before we release our strong reference to it. + self.statusController = statusCtl; // Keep a strong reference to the status controller, or else it might get prematurely deallocated. } [SUInstaller installFromUpdateFolder:self.folderpath overHost:self.host installationPath:self.installationPath - delegate:self - versionComparator:[SUStandardVersionComparator defaultComparator]]; -} - -- (void)installerFinishedForHost:(SUHost *)__unused aHost -{ - [self relaunch]; -} - -- (void)installerForHost:(SUHost *)__unused host failedWithError:(NSError *)error __attribute__((noreturn)) -{ - if (self.shouldShowUI) - NSRunAlertPanel(@"", @"%@", @"OK", @"", @"", [error localizedDescription]); - exit(EXIT_FAILURE); + versionComparator:[SUStandardVersionComparator defaultComparator] + completionHandler:^(NSError *error) { + if (error) { + if (self.shouldShowUI) { + NSRunAlertPanel(@"", @"%@", @"OK", @"", @"", [error localizedDescription]); + } + exit(EXIT_FAILURE); + } else { + [self relaunch]; + } + }]; } @end int main(int __unused argc, const char __unused *argv[]) { - @autoreleasepool { + @autoreleasepool + { NSArray *args = [[NSProcessInfo processInfo] arguments]; if (args.count < 5 || args.count > 7) { return EXIT_FAILURE; } BOOL shouldShowUI = (args.count > 6) ? [args[6] boolValue] : YES; - if (shouldShowUI) - { + if (shouldShowUI) { [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; } @@ -198,9 +201,9 @@ int main(int __unused argc, const char __unused *argv[]) shouldShowUI:shouldShowUI selfPath:[[NSBundle mainBundle] bundlePath]]; - [termListen class]; [[NSApplication sharedApplication] run]; - + // Ensure termListen is not deallocated by ARC before caling -[NSApplication run] + [termListen class]; } return EXIT_SUCCESS; diff --git a/Frameworks/Sparkle/Sparkle/SUAppcast.h b/Frameworks/Sparkle/Sparkle/SUAppcast.h index 7d455231b..8f3efc8e8 100644 --- a/Frameworks/Sparkle/Sparkle/SUAppcast.h +++ b/Frameworks/Sparkle/Sparkle/SUAppcast.h @@ -9,24 +9,18 @@ #ifndef SUAPPCAST_H #define SUAPPCAST_H +#import #import "SUExport.h" -@protocol SUAppcastDelegate; - @class SUAppcastItem; -SU_EXPORT @interface SUAppcast : NSObject +SU_EXPORT @interface SUAppcast : NSObject -@property (weak) id delegate; @property (copy) NSString *userAgentString; +@property (copy) NSDictionary *httpHeaders; -- (void)fetchAppcastFromURL:(NSURL *)url; +- (void)fetchAppcastFromURL:(NSURL *)url completionBlock:(void (^)(NSError *))err; @property (readonly, copy) NSArray *items; @end -@protocol SUAppcastDelegate -- (void)appcastDidFinishLoading:(SUAppcast *)appcast; -- (void)appcast:(SUAppcast *)appcast failedToLoadWithError:(NSError *)error; -@end - #endif diff --git a/Frameworks/Sparkle/Sparkle/SUAppcast.m b/Frameworks/Sparkle/Sparkle/SUAppcast.m index 196267fb9..eda206a97 100644 --- a/Frameworks/Sparkle/Sparkle/SUAppcast.m +++ b/Frameworks/Sparkle/Sparkle/SUAppcast.m @@ -33,6 +33,7 @@ @end @interface SUAppcast () +@property (strong) void (^completionBlock)(NSError *); @property (copy) NSString *downloadFilename; @property (strong) NSURLDownload *download; @property (copy) NSArray *items; @@ -43,18 +44,28 @@ @implementation SUAppcast @synthesize downloadFilename; -@synthesize delegate; +@synthesize completionBlock; @synthesize userAgentString; +@synthesize httpHeaders; @synthesize download; @synthesize items; -- (void)fetchAppcastFromURL:(NSURL *)url +- (void)fetchAppcastFromURL:(NSURL *)url completionBlock:(void (^)(NSError *))block { + self.completionBlock = block; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30.0]; if (self.userAgentString) { [request setValue:self.userAgentString forHTTPHeaderField:@"User-Agent"]; } + if (self.httpHeaders) { + for (NSString *key in self.httpHeaders) { + id value = [self.httpHeaders objectForKey:key]; + [request setValue:value forHTTPHeaderField:key]; + } + } + [request setValue:@"application/rss+xml,*/*;q=0.1" forHTTPHeaderField:@"Accept"]; self.download = [[NSURLDownload alloc] initWithRequest:request delegate:self]; @@ -202,31 +213,23 @@ } } - if ([appcastItems count]) - { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wselector" - // @selector(date) is from SUAppcastItem - NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:NSStringFromSelector(@selector(date)) ascending:NO]; -#pragma clang diagnostic pop + if ([appcastItems count]) { + NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO]; [appcastItems sortUsingDescriptors:@[sort]]; self.items = appcastItems; } - if (failed) - { + if (failed) { [self reportError:[NSError errorWithDomain:SUSparkleErrorDomain code:SUAppcastParseError userInfo:@{ NSLocalizedDescriptionKey: SULocalizedString(@"An error occurred while parsing the update feed.", nil) }]]; - } - else if ([self.delegate respondsToSelector:@selector(appcastDidFinishLoading:)]) - { - [self.delegate appcastDidFinishLoading:self]; + } else { + self.completionBlock(nil); + self.completionBlock = nil; } } - (void)download:(NSURLDownload *)__unused aDownload didFailWithError:(NSError *)error { - if (self.downloadFilename) - { + if (self.downloadFilename) { [[NSFileManager defaultManager] removeItemAtPath:self.downloadFilename error:nil]; } self.downloadFilename = nil; @@ -241,10 +244,15 @@ - (void)reportError:(NSError *)error { - if ([self.delegate respondsToSelector:@selector(appcast:failedToLoadWithError:)]) - { - [self.delegate appcast:self failedToLoadWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SUAppcastError userInfo:@{NSLocalizedDescriptionKey: SULocalizedString(@"An error occurred in retrieving update information. Please try again later.", nil), NSLocalizedFailureReasonErrorKey: [error localizedDescription]}]]; - } + NSURL *failingUrl = error.userInfo[NSURLErrorFailingURLErrorKey]; + + self.completionBlock([NSError errorWithDomain:SUSparkleErrorDomain code:SUAppcastError userInfo:@{ + NSLocalizedDescriptionKey: SULocalizedString(@"An error occurred in retrieving update information. Please try again later.", nil), + NSLocalizedFailureReasonErrorKey: [error localizedDescription], + NSUnderlyingErrorKey: error, + NSURLErrorFailingURLErrorKey: failingUrl ? failingUrl : [NSNull null], + }]); + self.completionBlock = nil; } - (NSXMLNode *)bestNodeInNodes:(NSArray *)nodes diff --git a/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateAlert.h b/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateAlert.h index 0a2c86102..1fcfcfb7b 100644 --- a/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateAlert.h +++ b/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateAlert.h @@ -11,8 +11,6 @@ #import "SUWindowController.h" -@protocol SUAutomaticUpdateAlertDelegate; - typedef NS_ENUM(NSInteger, SUAutomaticInstallationChoice) { SUInstallNowChoice, SUInstallLaterChoice, @@ -22,15 +20,11 @@ typedef NS_ENUM(NSInteger, SUAutomaticInstallationChoice) { @class SUAppcastItem, SUHost; @interface SUAutomaticUpdateAlert : SUWindowController -- (instancetype)initWithAppcastItem:(SUAppcastItem *)item host:(SUHost *)hostBundle delegate:(id)delegate; +- (instancetype)initWithAppcastItem:(SUAppcastItem *)item host:(SUHost *)hostBundle completionBlock:(void (^)(SUAutomaticInstallationChoice))c; - (IBAction)installNow:sender; - (IBAction)installLater:sender; - (IBAction)doNotInstall:sender; @end -@protocol SUAutomaticUpdateAlertDelegate -- (void)automaticUpdateAlert:(SUAutomaticUpdateAlert *)aua finishedWithChoice:(SUAutomaticInstallationChoice)choice; -@end - #endif diff --git a/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateAlert.m b/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateAlert.m index 85cb0cbcb..4271e6084 100644 --- a/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateAlert.m +++ b/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateAlert.m @@ -11,23 +11,22 @@ #import "SUHost.h" @interface SUAutomaticUpdateAlert () +@property (strong) void(^completionBlock)(SUAutomaticInstallationChoice); @property (strong) SUAppcastItem *updateItem; -@property (weak) id delegate; @property (strong) SUHost *host; @end @implementation SUAutomaticUpdateAlert -@synthesize delegate; @synthesize host; @synthesize updateItem; +@synthesize completionBlock; -- (instancetype)initWithAppcastItem:(SUAppcastItem *)item host:(SUHost *)aHost delegate:(id)del +- (instancetype)initWithAppcastItem:(SUAppcastItem *)item host:(SUHost *)aHost completionBlock:(void (^)(SUAutomaticInstallationChoice))block { - self = [super initWithHost:aHost windowNibName:@"SUAutomaticUpdateAlert"]; - if (self) - { + self = [super initWithWindowNibName:@"SUAutomaticUpdateAlert"]; + if (self) { self.updateItem = item; - self.delegate = del; + self.completionBlock = block; self.host = aHost; [self setShouldCascadeWindows:NO]; [[self window] center]; @@ -40,19 +39,22 @@ - (IBAction)installNow:(id)__unused sender { [self close]; - [self.delegate automaticUpdateAlert:self finishedWithChoice:SUInstallNowChoice]; + self.completionBlock(SUInstallNowChoice); + self.completionBlock = nil; } - (IBAction)installLater:(id)__unused sender { [self close]; - [self.delegate automaticUpdateAlert:self finishedWithChoice:SUInstallLaterChoice]; + self.completionBlock(SUInstallLaterChoice); + self.completionBlock = nil; } - (IBAction)doNotInstall:(id)__unused sender { [self close]; - [self.delegate automaticUpdateAlert:self finishedWithChoice:SUDoNotInstallChoice]; + self.completionBlock(SUDoNotInstallChoice); + self.completionBlock = nil; } - (NSImage *)applicationIcon diff --git a/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateDriver.h b/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateDriver.h index 9935936eb..4dd90e8f0 100644 --- a/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateDriver.h +++ b/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateDriver.h @@ -13,7 +13,7 @@ #import "SUBasicUpdateDriver.h" #import "SUAutomaticUpdateAlert.h" -@interface SUAutomaticUpdateDriver : SUBasicUpdateDriver +@interface SUAutomaticUpdateDriver : SUBasicUpdateDriver @end diff --git a/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateDriver.m b/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateDriver.m index 20a0a0658..45b3d5469 100644 --- a/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateDriver.m +++ b/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateDriver.m @@ -42,13 +42,14 @@ static const NSTimeInterval SUAutomaticUpdatePromptImpatienceTimer = 60 * 60 * 2 - (void)showUpdateAlert { self.interruptible = NO; - self.alert = [[SUAutomaticUpdateAlert alloc] initWithAppcastItem:self.updateItem host:self.host delegate:self]; + self.alert = [[SUAutomaticUpdateAlert alloc] initWithAppcastItem:self.updateItem host:self.host completionBlock:^(SUAutomaticInstallationChoice choice) { + [self automaticUpdateAlertFinishedWithChoice:choice]; + }]; // If the app is a menubar app or the like, we need to focus it first and alter the // update prompt to behave like a normal window. Otherwise if the window were hidden // there may be no way for the application to be activated to make it visible again. - if ([self.host isBackgroundApplication]) - { + if ([self.host isBackgroundApplication]) { [[self.alert window] setHidesOnDeactivate:NO]; [NSApp activateIgnoringOtherApps:YES]; } @@ -138,7 +139,7 @@ static const NSTimeInterval SUAutomaticUpdatePromptImpatienceTimer = 60 * 60 * 2 [[NSNotificationCenter defaultCenter] removeObserver:self name:NSApplicationDidBecomeActiveNotification object:NSApp]; } -- (void)automaticUpdateAlert:(SUAutomaticUpdateAlert *)__unused aua finishedWithChoice:(SUAutomaticInstallationChoice)choice +- (void)automaticUpdateAlertFinishedWithChoice:(SUAutomaticInstallationChoice)choice { switch (choice) { @@ -161,8 +162,6 @@ static const NSTimeInterval SUAutomaticUpdatePromptImpatienceTimer = 60 * 60 * 2 } } -- (BOOL)shouldInstallSynchronously { return self.postponingInstallation; } - - (void)installWithToolAndRelaunch:(BOOL)relaunch displayingUserInterface:(BOOL)showUI { if (relaunch) { @@ -180,10 +179,18 @@ static const NSTimeInterval SUAutomaticUpdatePromptImpatienceTimer = 60 * 60 * 2 - (void)abortUpdateWithError:(NSError *)error { - if (self.showErrors) + if (self.showErrors) { [super abortUpdateWithError:error]; - else + } else { + // Call delegate separately here because otherwise it won't know we stopped. + // Normally this gets called by the superclass + id updaterDelegate = [self.updater delegate]; + if ([updaterDelegate respondsToSelector:@selector(updater:didAbortWithError:)]) { + [updaterDelegate updater:self.updater didAbortWithError:error]; + } + [self abortUpdate]; + } } @end diff --git a/Frameworks/Sparkle/Sparkle/SUBasicUpdateDriver.h b/Frameworks/Sparkle/Sparkle/SUBasicUpdateDriver.h index 32e320bc6..8c6960d83 100644 --- a/Frameworks/Sparkle/Sparkle/SUBasicUpdateDriver.h +++ b/Frameworks/Sparkle/Sparkle/SUBasicUpdateDriver.h @@ -15,7 +15,7 @@ #import "SUAppcast.h" @class SUAppcastItem, SUHost; -@interface SUBasicUpdateDriver : SUUpdateDriver +@interface SUBasicUpdateDriver : SUUpdateDriver @property (strong, readonly) SUAppcastItem *updateItem; @property (strong, readonly) NSURLDownload *download; @@ -27,6 +27,7 @@ - (BOOL)hostSupportsItem:(SUAppcastItem *)ui; - (BOOL)itemContainsSkippedVersion:(SUAppcastItem *)ui; - (BOOL)itemContainsValidUpdate:(SUAppcastItem *)ui; +- (void)appcastDidFinishLoading:(SUAppcast *)ac; - (void)didFindValidUpdate; - (void)didNotFindUpdate; diff --git a/Frameworks/Sparkle/Sparkle/SUBasicUpdateDriver.m b/Frameworks/Sparkle/Sparkle/SUBasicUpdateDriver.m index 12147df72..a0536faba 100644 --- a/Frameworks/Sparkle/Sparkle/SUBasicUpdateDriver.m +++ b/Frameworks/Sparkle/Sparkle/SUBasicUpdateDriver.m @@ -54,9 +54,15 @@ SUAppcast *appcast = [[SUAppcast alloc] init]; - [appcast setDelegate:self]; [appcast setUserAgentString:[self.updater userAgentString]]; - [appcast fetchAppcastFromURL:URL]; + [appcast setHttpHeaders:[self.updater httpHeaders]]; + [appcast fetchAppcastFromURL:URL completionBlock:^(NSError *error) { + if (error) { + [self abortUpdateWithError:error]; + } else { + [self appcastDidFinishLoading:appcast]; + } + }]; } - (id)versionComparator @@ -136,12 +142,10 @@ item = [updateEnumerator nextObject]; } while (item && ![self hostSupportsItem:item]); - if (binaryDeltaSupported()) { - SUAppcastItem *deltaUpdateItem = [item deltaUpdates][[self.host version]]; - if (deltaUpdateItem && [self hostSupportsItem:deltaUpdateItem]) { - self.nonDeltaUpdateItem = item; - item = deltaUpdateItem; - } + SUAppcastItem *deltaUpdateItem = [item deltaUpdates][[self.host version]]; + if (deltaUpdateItem && [self hostSupportsItem:deltaUpdateItem]) { + self.nonDeltaUpdateItem = item; + item = deltaUpdateItem; } } @@ -154,11 +158,6 @@ } } -- (void)appcast:(SUAppcast *)__unused ac failedToLoadWithError:(NSError *)error -{ - [self abortUpdateWithError:error]; -} - - (void)didFindValidUpdate { assert(self.updateItem); @@ -200,11 +199,11 @@ NSString *downloadFileName = [NSString stringWithFormat:@"%@ %@", [self.host name], [self.updateItem versionString]]; - self.tempDir = [[self.host appSupportPath] stringByAppendingPathComponent:downloadFileName]; + self.tempDir = [self.host.appCachePath stringByAppendingPathComponent:downloadFileName]; int cnt = 1; while ([[NSFileManager defaultManager] fileExistsAtPath:self.tempDir] && cnt <= 999) { - self.tempDir = [[self.host appSupportPath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@ %d", downloadFileName, cnt++]]; + self.tempDir = [self.host.appCachePath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@ %d", downloadFileName, cnt++]]; } // Create the temporary directory if necessary. @@ -227,7 +226,7 @@ if (newBundlePath) { if ([SUCodeSigningVerifier hostApplicationIsCodeSigned]) { NSError *error = nil; - if ([SUCodeSigningVerifier codeSignatureIsValidAtPath:newBundlePath error:&error]) { + if ([SUCodeSigningVerifier codeSignatureMatchesHostAndIsValidAtPath:newBundlePath error:&error]) { return YES; } else { SULog(@"Code signature check on update failed: %@. Sparkle will use DSA signature instead.", error); @@ -254,7 +253,16 @@ - (void)download:(NSURLDownload *)__unused download didFailWithError:(NSError *)error { - [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SURelaunchError userInfo:@{NSLocalizedDescriptionKey: SULocalizedString(@"An error occurred while downloading the update. Please try again later.", nil), NSLocalizedFailureReasonErrorKey: [error localizedDescription]}]]; + NSURL *failingUrl = error.userInfo[NSURLErrorFailingURLErrorKey]; + if (!failingUrl) { + failingUrl = [self.updateItem fileURL]; + } + + [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SURelaunchError userInfo:@{ + NSLocalizedDescriptionKey: SULocalizedString(@"An error occurred while downloading the update. Please try again later.", nil), + NSUnderlyingErrorKey: error, + NSURLErrorFailingURLErrorKey: failingUrl ? failingUrl : [NSNull null], + }]]; } - (BOOL)download:(NSURLDownload *)__unused download shouldDecodeSourceDataOfMIMEType:(NSString *)encodingType @@ -266,14 +274,13 @@ - (void)extractUpdate { - SUUnarchiver *unarchiver = [SUUnarchiver unarchiverForPath:self.downloadPath updatingHost:self.host]; - if (!unarchiver) - { + SUUnarchiver *unarchiver = [SUUnarchiver unarchiverForPath:self.downloadPath updatingHostBundlePath:[[self.host bundle] bundlePath]]; + if (!unarchiver) { SULog(@"Error: No valid unarchiver for %@!", self.downloadPath); [self unarchiverDidFail:nil]; return; } - [unarchiver setDelegate:self]; + unarchiver.delegate = self; [unarchiver start]; } @@ -303,8 +310,6 @@ [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SUUnarchivingError userInfo:@{ NSLocalizedDescriptionKey: SULocalizedString(@"An error occurred while extracting the archive. Please try again later.", nil) }]]; } -- (BOOL)shouldInstallSynchronously { return NO; } - - (void)installWithToolAndRelaunch:(BOOL)relaunch { // Perhaps a poor assumption but: if we're not relaunching, we assume we shouldn't be showing any UI either. Because non-relaunching installations are kicked off without any user interaction, we shouldn't be interrupting them. @@ -356,27 +361,32 @@ // Copy the relauncher into a temporary directory so we can get to it after the new version's installed. // Only the paranoid survive: if there's already a stray copy of relaunch there, we would have problems. NSString *const relaunchPathToCopy = [sparkleBundle pathForResource:[[sparkleBundle infoDictionary] objectForKey:SURelaunchToolNameKey] ofType:@"app"]; - if (relaunchPathToCopy != nil) - { - NSString *targetPath = [[self.host appSupportPath] stringByAppendingPathComponent:[relaunchPathToCopy lastPathComponent]]; + if (relaunchPathToCopy != nil) { + NSString *targetPath = [self.host.appCachePath stringByAppendingPathComponent:[relaunchPathToCopy lastPathComponent]]; // Only the paranoid survive: if there's already a stray copy of relaunch there, we would have problems. NSError *error = nil; [[NSFileManager defaultManager] createDirectoryAtPath:[targetPath stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:@{} error:&error]; - if ([SUPlainInstaller copyPathWithAuthentication:relaunchPathToCopy overPath:targetPath temporaryName:nil error:&error]) + if ([SUPlainInstaller copyPathWithAuthentication:relaunchPathToCopy overPath:targetPath temporaryName:nil error:&error]) { self.relaunchPath = targetPath; - else - [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SURelaunchError userInfo:@{NSLocalizedDescriptionKey: SULocalizedString(@"An error occurred while extracting the archive. Please try again later.", nil), NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:@"Couldn't copy relauncher (%@) to temporary path (%@)! %@", relaunchPathToCopy, targetPath, (error ? [error localizedDescription] : @"")]}]]; + } else { + [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SURelaunchError userInfo:@{ + NSLocalizedDescriptionKey: SULocalizedString(@"An error occurred while extracting the archive. Please try again later.", nil), + NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:@"Couldn't copy relauncher (%@) to temporary path (%@)! %@", relaunchPathToCopy, targetPath, (error ? [error localizedDescription] : @"")] + }]]; + } } [[NSNotificationCenter defaultCenter] postNotificationName:SUUpdaterWillRestartNotification object:self]; if ([updaterDelegate respondsToSelector:@selector(updaterWillRelaunchApplication:)]) [updaterDelegate updaterWillRelaunchApplication:self.updater]; - if(!self.relaunchPath || ![[NSFileManager defaultManager] fileExistsAtPath:self.relaunchPath]) - { + if (!self.relaunchPath || ![[NSFileManager defaultManager] fileExistsAtPath:self.relaunchPath]) { // Note that we explicitly use the host app's name here, since updating plugin for Mail relaunches Mail, not just the plugin. - [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SURelaunchError userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithFormat:SULocalizedString(@"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@.", nil), [self.host name]], NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:@"Couldn't find the relauncher (expected to find it at %@)", self.relaunchPath]}]]; + [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SURelaunchError userInfo:@{ + NSLocalizedDescriptionKey: [NSString stringWithFormat:SULocalizedString(@"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@.", nil), [self.host name]], + NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:@"Couldn't find the relauncher (expected to find it at %@)", self.relaunchPath] + }]]; // We intentionally don't abandon the update here so that the host won't initiate another. return; } @@ -414,10 +424,16 @@ - (void)installerForHost:(SUHost *)aHost failedWithError:(NSError *)error { - if (aHost != self.host) { return; } + if (aHost != self.host) { + return; + } NSError *dontThrow = nil; [[NSFileManager defaultManager] removeItemAtPath:self.relaunchPath error:&dontThrow]; // Clean up the copied relauncher - [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SUInstallationError userInfo:@{NSLocalizedDescriptionKey: SULocalizedString(@"An error occurred while installing the update. Please try again later.", nil), NSLocalizedFailureReasonErrorKey: [error localizedDescription]}]]; + [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SUInstallationError userInfo:@{ + NSLocalizedDescriptionKey: SULocalizedString(@"An error occurred while installing the update. Please try again later.", nil), + NSLocalizedFailureReasonErrorKey: [error localizedDescription], + NSUnderlyingErrorKey: error, + }]]; } - (void)abortUpdate @@ -431,11 +447,18 @@ - (void)abortUpdateWithError:(NSError *)error { if ([error code] != SUNoUpdateError) { // Let's not bother logging this. - SULog(@"Error: %@ %@", [error localizedDescription], [error localizedFailureReason]); + SULog(@"Error: %@ %@ (URL %@)", error.localizedDescription, error.localizedFailureReason, error.userInfo[NSURLErrorFailingURLErrorKey]); } if (self.download) { [self.download cancel]; } + + // Notify host app that update has aborted + id updaterDelegate = [self.updater delegate]; + if ([updaterDelegate respondsToSelector:@selector(updater:didAbortWithError:)]) { + [updaterDelegate updater:self.updater didAbortWithError:error]; + } + [self abortUpdate]; } diff --git a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaApply.h b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaApply.h index d44501093..293c1e11a 100644 --- a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaApply.h +++ b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaApply.h @@ -10,6 +10,6 @@ #define SUBINARYDELTAAPPLY_H @class NSString; -int applyBinaryDelta(NSString *source, NSString *destination, NSString *patchFile); +int applyBinaryDelta(NSString *source, NSString *destination, NSString *patchFile, BOOL verbose); #endif diff --git a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaApply.m b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaApply.m index 85dbd0cd5..43952df98 100644 --- a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaApply.m +++ b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaApply.m @@ -15,57 +15,125 @@ #include #include -static void applyBinaryDeltaToFile(xar_t x, xar_file_t file, NSString *sourceFilePath, NSString *destinationFilePath) +static BOOL applyBinaryDeltaToFile(xar_t x, xar_file_t file, NSString *sourceFilePath, NSString *destinationFilePath) { NSString *patchFile = temporaryFilename(@"apply-binary-delta"); xar_extract_tofile(x, file, [patchFile fileSystemRepresentation]); const char *argv[] = {"/usr/bin/bspatch", [sourceFilePath fileSystemRepresentation], [destinationFilePath fileSystemRepresentation], [patchFile fileSystemRepresentation]}; - bspatch(4, (char **)argv); + BOOL success = (bspatch(4, (char **)argv) == 0); unlink([patchFile fileSystemRepresentation]); + return success; } -int applyBinaryDelta(NSString *source, NSString *destination, NSString *patchFile) +int applyBinaryDelta(NSString *source, NSString *destination, NSString *patchFile, BOOL verbose) { - xar_t x = xar_open([patchFile UTF8String], READ); + xar_t x = xar_open([patchFile fileSystemRepresentation], READ); if (!x) { - fprintf(stderr, "Unable to open %s. Giving up.\n", [patchFile UTF8String]); + fprintf(stderr, "Unable to open %s. Giving up.\n", [patchFile fileSystemRepresentation]); return 1; } + + SUBinaryDeltaMajorVersion majorDiffVersion = FIRST_DELTA_DIFF_MAJOR_VERSION; + SUBinaryDeltaMinorVersion minorDiffVersion = FIRST_DELTA_DIFF_MINOR_VERSION; - NSString *expectedBeforeHash = nil; - NSString *expectedAfterHash = nil; + NSString *expectedBeforeHashv1 = nil; + NSString *expectedAfterHashv1 = nil; + + NSString *expectedNewBeforeHash = nil; + NSString *expectedNewAfterHash = nil; + xar_subdoc_t subdoc; for (subdoc = xar_subdoc_first(x); subdoc; subdoc = xar_subdoc_next(subdoc)) { - if (!strcmp(xar_subdoc_name(subdoc), "binary-delta-attributes")) { + if (!strcmp(xar_subdoc_name(subdoc), BINARY_DELTA_ATTRIBUTES_KEY)) { const char *value = 0; - xar_subdoc_prop_get(subdoc, "before-sha1", &value); + + // available in version 2.0 or later + xar_subdoc_prop_get(subdoc, MAJOR_DIFF_VERSION_KEY, &value); if (value) - expectedBeforeHash = @(value); - - xar_subdoc_prop_get(subdoc, "after-sha1", &value); + majorDiffVersion = (SUBinaryDeltaMajorVersion)[@(value) intValue]; + + // available in version 2.0 or later + xar_subdoc_prop_get(subdoc, MINOR_DIFF_VERSION_KEY, &value); if (value) - expectedAfterHash = @(value); + minorDiffVersion = (SUBinaryDeltaMinorVersion)[@(value) intValue]; + + // available in version 2.0 or later + xar_subdoc_prop_get(subdoc, BEFORE_TREE_SHA1_KEY, &value); + if (value) + expectedNewBeforeHash = @(value); + + // available in version 2.0 or later + xar_subdoc_prop_get(subdoc, AFTER_TREE_SHA1_KEY, &value); + if (value) + expectedNewAfterHash = @(value); + + // only available in version 1.0 + xar_subdoc_prop_get(subdoc, BEFORE_TREE_SHA1_OLD_KEY, &value); + if (value) + expectedBeforeHashv1 = @(value); + + // only available in version 1.0 + xar_subdoc_prop_get(subdoc, AFTER_TREE_SHA1_OLD_KEY, &value); + if (value) + expectedAfterHashv1 = @(value); } } + + if (majorDiffVersion < FIRST_DELTA_DIFF_MAJOR_VERSION) { + fprintf(stderr, "Unable to identify diff-version %u in delta. Giving up.\n", majorDiffVersion); + return 1; + } + + if (majorDiffVersion > LATEST_DELTA_DIFF_MAJOR_VERSION) { + fprintf(stderr, "A later version is needed to apply this patch (on major version %u, but patch requests version %u).\n", LATEST_DELTA_DIFF_MAJOR_VERSION, majorDiffVersion); + return 1; + } + + BOOL usesNewTreeHash = MAJOR_VERSION_IS_AT_LEAST(majorDiffVersion, SUBeigeMajorVersion); + + NSString *expectedBeforeHash = usesNewTreeHash ? expectedNewBeforeHash : expectedBeforeHashv1; + NSString *expectedAfterHash = usesNewTreeHash ? expectedNewAfterHash : expectedAfterHashv1; if (!expectedBeforeHash || !expectedAfterHash) { fprintf(stderr, "Unable to find before-sha1 or after-sha1 metadata in delta. Giving up.\n"); return 1; } - fprintf(stderr, "Verifying source... "); - NSString *beforeHash = hashOfTree(source); - - if (![beforeHash isEqualToString:expectedBeforeHash]) { - fprintf(stderr, "Source doesn't have expected hash (%s != %s). Giving up.\n", [expectedBeforeHash UTF8String], [beforeHash UTF8String]); + if (verbose) { + fprintf(stderr, "Applying version %u.%u patch...\n", majorDiffVersion, minorDiffVersion); + fprintf(stderr, "Verifying source..."); + } + + NSString *beforeHash = hashOfTreeWithVersion(source, majorDiffVersion); + if (!beforeHash) { + fprintf(stderr, "\nUnable to calculate hash of tree %s\n", [source fileSystemRepresentation]); return 1; } - fprintf(stderr, "\nCopying files... "); - removeTree(destination); - copyTree(source, destination); + if (![beforeHash isEqualToString:expectedBeforeHash]) { + fprintf(stderr, "\nSource doesn't have expected hash (%s != %s). Giving up.\n", [expectedBeforeHash UTF8String], [beforeHash UTF8String]); + return 1; + } - fprintf(stderr, "\nPatching... "); + if (verbose) { + fprintf(stderr, "\nCopying files..."); + } + + if (!removeTree(destination)) { + fprintf(stderr, "\nFailed to remove %s\n", [destination fileSystemRepresentation]); + return 1; + } + if (!copyTree(source, destination)) { + fprintf(stderr, "\nFailed to copy %s to %s\n", [source fileSystemRepresentation], [destination fileSystemRepresentation]); + return 1; + } + + BOOL hasExtractKeyAvailable = MAJOR_VERSION_IS_AT_LEAST(majorDiffVersion, SUBeigeMajorVersion); + + if (verbose) { + fprintf(stderr, "\nPatching..."); + } + NSFileManager *fileManager = [[NSFileManager alloc] init]; xar_file_t file; xar_iter_t iter = xar_iter_new(); for (file = xar_file_first(x, iter); file; file = xar_file_next(iter)) { @@ -73,29 +141,86 @@ int applyBinaryDelta(NSString *source, NSString *destination, NSString *patchFil NSString *sourceFilePath = [source stringByAppendingPathComponent:path]; NSString *destinationFilePath = [destination stringByAppendingPathComponent:path]; + // Don't use -[NSFileManager fileExistsAtPath:] because it will follow symbolic links + BOOL fileExisted = verbose && [fileManager attributesOfItemAtPath:destinationFilePath error:nil]; + BOOL removedFile = NO; + const char *value; - if (!xar_prop_get(file, "delete", &value) || !xar_prop_get(file, "delete-then-extract", &value)) { - removeTree(destinationFilePath); - if (!xar_prop_get(file, "delete", &value)) + if (!xar_prop_get(file, DELETE_KEY, &value) || + (!hasExtractKeyAvailable && !xar_prop_get(file, DELETE_THEN_EXTRACT_OLD_KEY, &value))) { + if (!removeTree(destinationFilePath)) { + fprintf(stderr, "\n%s or %s: failed to remove %s\n", DELETE_KEY, DELETE_THEN_EXTRACT_OLD_KEY, [destination fileSystemRepresentation]); + return 1; + } + if (!hasExtractKeyAvailable && !xar_prop_get(file, DELETE_KEY, &value)) { + if (verbose) { + fprintf(stderr, "\n❌ %s %s", VERBOSE_DELETED, [path fileSystemRepresentation]); + } continue; + } + + removedFile = YES; } - if (!xar_prop_get(file, "binary-delta", &value)) - applyBinaryDeltaToFile(x, file, sourceFilePath, destinationFilePath); - else - xar_extract_tofile(x, file, [destinationFilePath fileSystemRepresentation]); + if (!xar_prop_get(file, BINARY_DELTA_KEY, &value)) { + if (!applyBinaryDeltaToFile(x, file, sourceFilePath, destinationFilePath)) { + fprintf(stderr, "\nUnable to patch %s to destination %s\n", [sourceFilePath fileSystemRepresentation], [destinationFilePath fileSystemRepresentation]); + return 1; + } + + if (verbose) { + fprintf(stderr, "\n🔨 %s %s", VERBOSE_PATCHED, [path fileSystemRepresentation]); + } + } else if ((hasExtractKeyAvailable && !xar_prop_get(file, EXTRACT_KEY, &value)) || + (!hasExtractKeyAvailable && xar_prop_get(file, MODIFY_PERMISSIONS_KEY, &value))) { // extract and permission modifications don't coexist + + if (xar_extract_tofile(x, file, [destinationFilePath fileSystemRepresentation]) != 0) { + fprintf(stderr, "\nUnable to extract file to %s\n", [destinationFilePath fileSystemRepresentation]); + return 1; + } + + if (verbose) { + if (fileExisted) { + fprintf(stderr, "\n✏️ %s %s", VERBOSE_UPDATED, [path fileSystemRepresentation]); + } else { + fprintf(stderr, "\n✅ %s %s", VERBOSE_ADDED, [path fileSystemRepresentation]); + } + } + } else if (verbose && removedFile) { + fprintf(stderr, "\n❌ %s %s", VERBOSE_DELETED, [path fileSystemRepresentation]); + } + + if (!xar_prop_get(file, MODIFY_PERMISSIONS_KEY, &value)) { + mode_t mode = (mode_t)[[NSString stringWithUTF8String:value] intValue]; + if (!modifyPermissions(destinationFilePath, mode)) { + fprintf(stderr, "\nUnable to modify permissions (%s) on file %s\n", value, [destinationFilePath fileSystemRepresentation]); + return 1; + } + + if (verbose) { + fprintf(stderr, "\n👮 %s %s (0%o)", VERBOSE_MODIFIED, [path fileSystemRepresentation], mode); + } + } } xar_close(x); - fprintf(stderr, "\nVerifying destination... "); - NSString *afterHash = hashOfTree(destination); + if (verbose) { + fprintf(stderr, "\nVerifying destination..."); + } + NSString *afterHash = hashOfTreeWithVersion(destination, majorDiffVersion); + if (!afterHash) { + fprintf(stderr, "\nUnable to calculate hash of tree %s\n", [destination fileSystemRepresentation]); + return 1; + } if (![afterHash isEqualToString:expectedAfterHash]) { - fprintf(stderr, "Destination doesn't have expected hash (%s != %s). Giving up.\n", [expectedAfterHash UTF8String], [afterHash UTF8String]); + fprintf(stderr, "\nDestination doesn't have expected hash (%s != %s). Giving up.\n", [expectedAfterHash UTF8String], [afterHash UTF8String]); removeTree(destination); return 1; } - fprintf(stderr, "\nDone!\n"); + if (verbose) { + fprintf(stderr, "\nDone!\n"); + } return 0; } diff --git a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCommon.h b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCommon.h index 4e330da7c..44a5d04e4 100644 --- a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCommon.h +++ b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCommon.h @@ -11,16 +11,71 @@ #include +#define PERMISSION_FLAGS (S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX) + +#define IS_VALID_PERMISSIONS(mode) \ + (((mode & PERMISSION_FLAGS) == 0755) || ((mode & PERMISSION_FLAGS) == 0644)) + +#define BINARY_DELTA_ATTRIBUTES_KEY "binary-delta-attributes" +#define MAJOR_DIFF_VERSION_KEY "major-version" +#define MINOR_DIFF_VERSION_KEY "minor-version" +#define BEFORE_TREE_SHA1_KEY "before-tree-sha1" +#define AFTER_TREE_SHA1_KEY "after-tree-sha1" +#define DELETE_KEY "delete" +#define EXTRACT_KEY "extract" +#define BINARY_DELTA_KEY "binary-delta" +#define MODIFY_PERMISSIONS_KEY "mod-permissions" + +// Properties no longer used in new patches +#define DELETE_THEN_EXTRACT_OLD_KEY "delete-then-extract" +#define BEFORE_TREE_SHA1_OLD_KEY "before-sha1" +#define AFTER_TREE_SHA1_OLD_KEY "after-sha1" + +#define VERBOSE_DELETED "Deleted" // file is deleted from the file system when applying a patch +#define VERBOSE_REMOVED "Removed" // file is set to be removed when creating a patch +#define VERBOSE_ADDED "Added" // file is added to the patch or file system +#define VERBOSE_DIFFED "Diffed" // file is diffed when creating a patch +#define VERBOSE_PATCHED "Patched" // file is patched when applying a patch +#define VERBOSE_UPDATED "Updated" // file's contents are updated +#define VERBOSE_MODIFIED "Modified" // file's metadata is modified + +#define MAJOR_VERSION_IS_AT_LEAST(actualMajor, expectedMajor) (actualMajor >= expectedMajor) + +// Each major version will be assigned a name of a color +// Changes that break backwards compatibility will have different major versions +// Changes that affect creating but not applying patches will have different minor versions + +typedef NS_ENUM(uint16_t, SUBinaryDeltaMajorVersion) +{ + SUAzureMajorVersion = 1, + SUBeigeMajorVersion = 2 +}; + +// Only keep track of the latest minor version for each major version +typedef NS_ENUM(uint16_t, SUBinaryDeltaMinorVersion) +{ + SUAzureMinorVersion = 1, + SUBeigeMinorVersion = 0, +}; + +#define FIRST_DELTA_DIFF_MAJOR_VERSION SUAzureMajorVersion +#define FIRST_DELTA_DIFF_MINOR_VERSION 0 + +#define LATEST_DELTA_DIFF_MAJOR_VERSION SUBeigeMajorVersion + @class NSString; @class NSData; -extern int binaryDeltaSupported(void); extern int compareFiles(const FTSENT **a, const FTSENT **b); -extern NSData *hashOfFile(FTSENT *ent); +extern NSData *hashOfFileContents(FTSENT *ent); +extern NSString *hashOfTreeWithVersion(NSString *path, uint16_t majorVersion); extern NSString *hashOfTree(NSString *path); -extern void removeTree(NSString *path); -extern void copyTree(NSString *source, NSString *dest); +extern BOOL removeTree(NSString *path); +extern BOOL copyTree(NSString *source, NSString *dest); +extern BOOL modifyPermissions(NSString *path, mode_t desiredPermissions); extern NSString *pathRelativeToDirectory(NSString *directory, NSString *path); NSString *temporaryFilename(NSString *base); +NSString *temporaryDirectory(NSString *base); NSString *stringWithFileSystemRepresentation(const char*); +SUBinaryDeltaMinorVersion latestMinorVersionForMajorVersion(SUBinaryDeltaMajorVersion majorVersion); #endif diff --git a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCommon.m b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCommon.m index 78ba2606b..9bde20c31 100644 --- a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCommon.m +++ b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCommon.m @@ -17,13 +17,6 @@ #include #include -int binaryDeltaSupported(void) -{ - // OS X 10.4 didn't include libxar, so we link against it weakly. - // This checks whether libxar is available at runtime. - return xar_close != 0; -} - int compareFiles(const FTSENT **a, const FTSENT **b) { return strcoll((*a)->fts_name, (*b)->fts_name); @@ -42,6 +35,17 @@ NSString *stringWithFileSystemRepresentation(const char *input) { return [[NSFileManager defaultManager] stringWithFileSystemRepresentation:input length:strlen(input)]; } +SUBinaryDeltaMinorVersion latestMinorVersionForMajorVersion(SUBinaryDeltaMajorVersion majorVersion) +{ + switch (majorVersion) { + case SUAzureMajorVersion: + return SUAzureMinorVersion; + case SUBeigeMajorVersion: + return SUBeigeMinorVersion; + } + return 0; +} + NSString *temporaryFilename(NSString *base) { NSString *template = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.XXXXXXXXXX", base]]; @@ -63,6 +67,22 @@ NSString *temporaryFilename(NSString *base) return stringWithFileSystemRepresentation(buffer); } +NSString *temporaryDirectory(NSString *base) +{ + NSString *template = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.XXXXXXXXXX", base]]; + NSMutableData *data = [NSMutableData data]; + [data appendBytes:template.fileSystemRepresentation length:strlen(template.fileSystemRepresentation) + 1]; + + char *buffer = data.mutableBytes; + char *templateResult = mkdtemp(buffer); + if (templateResult == NULL) { + perror("mkdtemp"); + return nil; + } + + return stringWithFileSystemRepresentation(templateResult); +} + static void _hashOfBuffer(unsigned char *hash, const char* buffer, ssize_t bufferLength) { assert(bufferLength >= 0 && bufferLength <= UINT32_MAX); @@ -72,59 +92,57 @@ static void _hashOfBuffer(unsigned char *hash, const char* buffer, ssize_t buffe CC_SHA1_Final(hash, &hashContext); } -static void _hashOfFile(unsigned char* hash, FTSENT *ent) +static BOOL _hashOfFileContents(unsigned char* hash, FTSENT *ent) { if (ent->fts_info == FTS_SL) { char linkDestination[MAXPATHLEN + 1]; ssize_t linkDestinationLength = readlink(ent->fts_path, linkDestination, MAXPATHLEN); if (linkDestinationLength < 0) { perror("readlink"); - return; + return NO; } _hashOfBuffer(hash, linkDestination, linkDestinationLength); - return; - } - - if (ent->fts_info == FTS_F) { + } else if (ent->fts_info == FTS_F) { int fileDescriptor = open(ent->fts_path, O_RDONLY); if (fileDescriptor == -1) { perror("open"); - return; + return NO; } ssize_t fileSize = ent->fts_statp->st_size; if (fileSize == 0) { _hashOfBuffer(hash, NULL, 0); - close(fileDescriptor); - return; + } else { + void *buffer = mmap(0, (size_t)fileSize, PROT_READ, MAP_FILE | MAP_PRIVATE, fileDescriptor, 0); + if (buffer == (void*)-1) { + close(fileDescriptor); + perror("mmap"); + return NO; + } + + _hashOfBuffer(hash, buffer, fileSize); + munmap(buffer, (size_t)fileSize); } - - void *buffer = mmap(0, (size_t)fileSize, PROT_READ, MAP_FILE | MAP_PRIVATE, fileDescriptor, 0); - if (buffer == (void*)-1) { - close(fileDescriptor); - perror("mmap"); - return; - } - - _hashOfBuffer(hash, buffer, fileSize); - munmap(buffer, (size_t)fileSize); close(fileDescriptor); - return; - } - - if (ent->fts_info == FTS_D) + } else if (ent->fts_info == FTS_D) { memset(hash, 0xdd, CC_SHA1_DIGEST_LENGTH); + } else { + return NO; + } + return YES; } -NSData *hashOfFile(FTSENT *ent) +NSData *hashOfFileContents(FTSENT *ent) { unsigned char fileHash[CC_SHA1_DIGEST_LENGTH]; - _hashOfFile(fileHash, ent); + if (!_hashOfFileContents(fileHash, ent)) { + return nil; + } return [NSData dataWithBytes:fileHash length:CC_SHA1_DIGEST_LENGTH]; } -NSString *hashOfTree(NSString *path) +NSString *hashOfTreeWithVersion(NSString *path, uint16_t majorVersion) { const char *sourcePaths[] = {[path fileSystemRepresentation], 0}; FTS *fts = fts_open((char* const*)sourcePaths, FTS_PHYSICAL | FTS_NOCHDIR, compareFiles); @@ -138,16 +156,34 @@ NSString *hashOfTree(NSString *path) FTSENT *ent = 0; while ((ent = fts_read(fts))) { - if (ent->fts_info != FTS_F && ent->fts_info != FTS_SL) + if (ent->fts_info != FTS_F && ent->fts_info != FTS_SL && ent->fts_info != FTS_D) + continue; + + if (ent->fts_info == FTS_D && !MAJOR_VERSION_IS_AT_LEAST(majorVersion, SUBeigeMajorVersion)) { + continue; + } + + NSString *relativePath = pathRelativeToDirectory(path, stringWithFileSystemRepresentation(ent->fts_path)); + if (relativePath.length == 0) continue; unsigned char fileHash[CC_SHA1_DIGEST_LENGTH]; - _hashOfFile(fileHash, ent); + if (!_hashOfFileContents(fileHash, ent)) { + return nil; + } CC_SHA1_Update(&hashContext, fileHash, sizeof(fileHash)); - NSString *relativePath = pathRelativeToDirectory(path, stringWithFileSystemRepresentation(ent->fts_path)); const char *relativePathBytes = [relativePath fileSystemRepresentation]; CC_SHA1_Update(&hashContext, relativePathBytes, (CC_LONG)strlen(relativePathBytes)); + + if (MAJOR_VERSION_IS_AT_LEAST(majorVersion, SUBeigeMajorVersion)) { + uint16_t mode = ent->fts_statp->st_mode; + uint16_t type = ent->fts_info; + uint16_t permissions = mode & PERMISSION_FLAGS; + + CC_SHA1_Update(&hashContext, &type, sizeof(type)); + CC_SHA1_Update(&hashContext, &permissions, sizeof(permissions)); + } } fts_close(fts); @@ -162,12 +198,41 @@ NSString *hashOfTree(NSString *path) return @(hexHash); } -void removeTree(NSString *path) +extern NSString *hashOfTree(NSString *path) { - [[NSFileManager defaultManager] removeItemAtPath:path error:nil]; + return hashOfTreeWithVersion(path, LATEST_DELTA_DIFF_MAJOR_VERSION); } -void copyTree(NSString *source, NSString *dest) +BOOL removeTree(NSString *path) { - [[NSFileManager defaultManager] copyItemAtPath:source toPath:dest error:nil]; + NSFileManager *fileManager = [NSFileManager defaultManager]; + // Don't use fileExistsForPath: because it will try to follow symbolic links + if (![fileManager attributesOfItemAtPath:path error:nil]) { + return YES; + } + return [fileManager removeItemAtPath:path error:nil]; +} + +BOOL copyTree(NSString *source, NSString *dest) +{ + return [[NSFileManager defaultManager] copyItemAtPath:source toPath:dest error:nil]; +} + +BOOL modifyPermissions(NSString *path, mode_t desiredPermissions) +{ + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSDictionary *attributes = [fileManager attributesOfItemAtPath:path error:nil]; + if (!attributes) { + return NO; + } + NSNumber *permissions = attributes[NSFilePosixPermissions]; + if (!permissions) { + return NO; + } + mode_t newMode = ([permissions unsignedShortValue] & ~PERMISSION_FLAGS) | desiredPermissions; + int (*changeModeFunc)(const char *, mode_t) = [attributes[NSFileType] isEqualToString:NSFileTypeSymbolicLink] ? lchmod : chmod; + if (changeModeFunc([path fileSystemRepresentation], newMode) != 0) { + return NO; + } + return YES; } diff --git a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCreate.h b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCreate.h new file mode 100644 index 000000000..4afc22817 --- /dev/null +++ b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCreate.h @@ -0,0 +1,17 @@ +// +// SUBinaryDeltaCreate.m +// Sparkle +// +// Created by Mayur Pawashe on 4/9/15. +// Copyright (c) 2015 Sparkle Project. All rights reserved. +// + +#ifndef SUBINARYDELTACREATE_H +#define SUBINARYDELTACREATE_H + +#import "SUBinaryDeltaCommon.h" + +@class NSString; +int createBinaryDelta(NSString *source, NSString *destination, NSString *patchFile, SUBinaryDeltaMajorVersion majorVersion, BOOL verbose); + +#endif diff --git a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCreate.m b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCreate.m new file mode 100644 index 000000000..a477d6740 --- /dev/null +++ b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCreate.m @@ -0,0 +1,462 @@ +// +// SUBinaryDeltaCreate.m +// Sparkle +// +// Created by Mayur Pawashe on 4/9/15. +// Copyright (c) 2015 Sparkle Project. All rights reserved. +// + +#import "SUBinaryDeltaCreate.h" +#import +#include "SUBinaryDeltaCommon.h" +#import +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern int bsdiff(int argc, const char **argv); + +@interface CreateBinaryDeltaOperation : NSOperation +@property (copy) NSString *relativePath; +@property (strong) NSString *resultPath; +@property (strong) NSNumber *oldPermissions; +@property (strong) NSNumber *permissions; +@property (strong) NSString *_fromPath; +@property (strong) NSString *_toPath; +- (id)initWithRelativePath:(NSString *)relativePath oldTree:(NSString *)oldTree newTree:(NSString *)newTree oldPermissions:(NSNumber *)oldPermissions newPermissions:(NSNumber *)permissions; +@end + +@implementation CreateBinaryDeltaOperation +@synthesize relativePath = _relativePath; +@synthesize resultPath = _resultPath; +@synthesize oldPermissions = _oldPermissions; +@synthesize permissions = _permissions; +@synthesize _fromPath = _fromPath; +@synthesize _toPath = _toPath; + +- (id)initWithRelativePath:(NSString *)relativePath oldTree:(NSString *)oldTree newTree:(NSString *)newTree oldPermissions:(NSNumber *)oldPermissions newPermissions:(NSNumber *)permissions +{ + if ((self = [super init])) { + self.relativePath = relativePath; + self.oldPermissions = oldPermissions; + self.permissions = permissions; + self._fromPath = [oldTree stringByAppendingPathComponent:relativePath]; + self._toPath = [newTree stringByAppendingPathComponent:relativePath]; + } + return self; +} + +- (void)main +{ + NSString *temporaryFile = temporaryFilename(@"BinaryDelta"); + const char *argv[] = {"/usr/bin/bsdiff", [self._fromPath fileSystemRepresentation], [self._toPath fileSystemRepresentation], [temporaryFile fileSystemRepresentation]}; + int result = bsdiff(4, argv); + if (!result) + self.resultPath = temporaryFile; +} + +@end + +#define INFO_HASH_KEY @"hash" +#define INFO_TYPE_KEY @"type" +#define INFO_PERMISSIONS_KEY @"permissions" +#define INFO_SIZE_KEY @"size" + +static NSDictionary *infoForFile(FTSENT *ent) +{ + NSData *hash = hashOfFileContents(ent); + if (!hash) { + return nil; + } + + off_t size = (ent->fts_info != FTS_D) ? ent->fts_statp->st_size : 0; + + assert(ent->fts_statp != NULL); + + mode_t permissions = ent->fts_statp->st_mode & PERMISSION_FLAGS; + + return @{INFO_HASH_KEY: hash, INFO_TYPE_KEY: @(ent->fts_info), INFO_PERMISSIONS_KEY : @(permissions), INFO_SIZE_KEY: @(size)}; +} + +static bool aclExists(const FTSENT *ent) +{ + // OS X does not currently support ACLs for symlinks + if (ent->fts_info == FTS_SL) { + return NO; + } + + acl_t acl = acl_get_link_np(ent->fts_path, ACL_TYPE_EXTENDED); + if (acl != NULL) { + acl_entry_t entry; + int result = acl_get_entry(acl, ACL_FIRST_ENTRY, &entry); + assert(acl_free((void *)acl) == 0); + return (result == 0); + } + return false; +} + +static NSString *absolutePath(NSString *path) +{ + NSURL *url = [[NSURL alloc] initFileURLWithPath:path]; + return [[url absoluteURL] path]; +} + +static NSString *temporaryPatchFile(NSString *patchFile) +{ + NSString *path = absolutePath(patchFile); + NSString *directory = [path stringByDeletingLastPathComponent]; + NSString *file = [path lastPathComponent]; + return [NSString stringWithFormat:@"%@/.%@.tmp", directory, file]; +} + +#define MIN_FILE_SIZE_FOR_CREATING_DELTA 4096 + +static BOOL shouldSkipDeltaCompression(NSDictionary* originalInfo, NSDictionary *newInfo) +{ + unsigned long long fileSize = [newInfo[INFO_SIZE_KEY] unsignedLongLongValue]; + if (fileSize < MIN_FILE_SIZE_FOR_CREATING_DELTA) { + return YES; + } + + if (!originalInfo) { + return YES; + } + + if ([originalInfo[INFO_TYPE_KEY] unsignedShortValue] != [newInfo[INFO_TYPE_KEY] unsignedShortValue]) { + return YES; + } + + if ([originalInfo[INFO_HASH_KEY] isEqual:newInfo[INFO_HASH_KEY]]) { + // this is possible if just the permissions have changed + return YES; + } + + return NO; +} + +static BOOL shouldDeleteThenExtract(NSDictionary* originalInfo, NSDictionary *newInfo) +{ + if (!originalInfo) { + return NO; + } + + if ([originalInfo[INFO_TYPE_KEY] unsignedShortValue] != [newInfo[INFO_TYPE_KEY] unsignedShortValue]) { + return YES; + } + + return NO; +} + +static BOOL shouldSkipExtracting(NSDictionary *originalInfo, NSDictionary *newInfo) +{ + if (!originalInfo) { + return NO; + } + + if ([originalInfo[INFO_TYPE_KEY] unsignedShortValue] != [newInfo[INFO_TYPE_KEY] unsignedShortValue]) { + return NO; + } + + if (![originalInfo[INFO_HASH_KEY] isEqual:newInfo[INFO_HASH_KEY]]) { + return NO; + } + + return YES; +} + +static BOOL shouldChangePermissions(NSDictionary *originalInfo, NSDictionary *newInfo) +{ + if (!originalInfo) { + return NO; + } + + if ([originalInfo[INFO_TYPE_KEY] unsignedShortValue] != [newInfo[INFO_TYPE_KEY] unsignedShortValue]) { + return NO; + } + + if ([originalInfo[INFO_PERMISSIONS_KEY] unsignedShortValue] == [newInfo[INFO_PERMISSIONS_KEY] unsignedShortValue]) { + return NO; + } + + return YES; +} + +int createBinaryDelta(NSString *source, NSString *destination, NSString *patchFile, SUBinaryDeltaMajorVersion majorVersion, BOOL verbose) +{ + if (majorVersion < FIRST_DELTA_DIFF_MAJOR_VERSION) { + fprintf(stderr, "Version provided (%u) is not valid\n", majorVersion); + return 1; + } + + if (majorVersion > LATEST_DELTA_DIFF_MAJOR_VERSION) { + fprintf(stderr, "This program is too old to create a version %u patch, or the version number provided is invalid\n", majorVersion); + return 1; + } + + SUBinaryDeltaMinorVersion minorVersion = latestMinorVersionForMajorVersion(majorVersion); + + NSMutableDictionary *originalTreeState = [NSMutableDictionary dictionary]; + + const char *sourcePaths[] = {[source fileSystemRepresentation], 0}; + FTS *fts = fts_open((char* const*)sourcePaths, FTS_PHYSICAL | FTS_NOCHDIR, compareFiles); + if (!fts) { + perror("fts_open"); + return 1; + } + + if (verbose) { + fprintf(stderr, "Creating version %u.%u patch...\n", majorVersion, minorVersion); + fprintf(stderr, "Processing %s...", [source fileSystemRepresentation]); + } + + FTSENT *ent = 0; + while ((ent = fts_read(fts))) { + if (ent->fts_info != FTS_F && ent->fts_info != FTS_SL && ent->fts_info != FTS_D) { + continue; + } + + NSString *key = pathRelativeToDirectory(source, stringWithFileSystemRepresentation(ent->fts_path)); + if (![key length]) { + continue; + } + + NSDictionary *info = infoForFile(ent); + if (!info) { + fprintf(stderr, "\nFailed to retrieve info for file %s\n", ent->fts_path); + return 1; + } + originalTreeState[key] = info; + + if (aclExists(ent)) { + fprintf(stderr, "\nDiffing ACLs are not supported. Detected ACL in before-tree on file %s\n", ent->fts_path); + return 1; + } + } + fts_close(fts); + + NSString *beforeHash = hashOfTreeWithVersion(source, majorVersion); + + if (!beforeHash) { + fprintf(stderr, "\nFailed to generate hash for tree %s\n", [source fileSystemRepresentation]); + return 1; + } + + NSMutableDictionary *newTreeState = [NSMutableDictionary dictionary]; + for (NSString *key in originalTreeState) + { + newTreeState[key] = [NSNull null]; + } + + if (verbose) { + fprintf(stderr, "\nProcessing %s...", [destination fileSystemRepresentation]); + } + + sourcePaths[0] = [destination fileSystemRepresentation]; + fts = fts_open((char* const*)sourcePaths, FTS_PHYSICAL | FTS_NOCHDIR, compareFiles); + if (!fts) { + perror("fts_open"); + return 1; + } + + + while ((ent = fts_read(fts))) { + if (ent->fts_info != FTS_F && ent->fts_info != FTS_SL && ent->fts_info != FTS_D) { + continue; + } + + NSString *key = pathRelativeToDirectory(destination, stringWithFileSystemRepresentation(ent->fts_path)); + if (![key length]) { + continue; + } + + NSDictionary *info = infoForFile(ent); + if (!info) { + fprintf(stderr, "\nFailed to retrieve info from file %s\n", ent->fts_path); + return 1; + } + + // We should validate permissions and ACLs even if we don't store the info in the diff in the case of ACLs, + // or in the case of permissions if the patch version is 1 + + mode_t permissions = [info[INFO_PERMISSIONS_KEY] unsignedShortValue]; + if (!IS_VALID_PERMISSIONS(permissions)) { + fprintf(stderr, "\nInvalid file permissions after-tree on file %s\nOnly permissions with modes 0755 and 0644 are supported\n", ent->fts_path); + return 1; + } + + if (aclExists(ent)) { + fprintf(stderr, "\nDiffing ACLs are not supported. Detected ACL in after-tree on file %s\n", ent->fts_path); + return 1; + } + + NSDictionary *oldInfo = originalTreeState[key]; + + if ([info isEqual:oldInfo]) { + [newTreeState removeObjectForKey:key]; + } else { + newTreeState[key] = info; + + if (oldInfo && [oldInfo[INFO_TYPE_KEY] unsignedShortValue] == FTS_D && [info[INFO_TYPE_KEY] unsignedShortValue] != FTS_D) { + NSArray *parentPathComponents = key.pathComponents; + + for (NSString *childPath in originalTreeState) { + NSArray *childPathComponents = childPath.pathComponents; + if (childPathComponents.count > parentPathComponents.count && + [parentPathComponents isEqualToArray:[childPathComponents subarrayWithRange:NSMakeRange(0, parentPathComponents.count)]]) { + [newTreeState removeObjectForKey:childPath]; + } + } + } + } + } + fts_close(fts); + + NSString *afterHash = hashOfTreeWithVersion(destination, majorVersion); + if (!afterHash) { + fprintf(stderr, "\nFailed to generate hash for tree %s\n", [destination fileSystemRepresentation]); + return 1; + } + + if (verbose) { + fprintf(stderr, "\nGenerating delta..."); + } + + NSString *temporaryFile = temporaryPatchFile(patchFile); + xar_t x = xar_open([temporaryFile fileSystemRepresentation], WRITE); + xar_opt_set(x, XAR_OPT_COMPRESSION, "bzip2"); + + xar_subdoc_t attributes = xar_subdoc_new(x, BINARY_DELTA_ATTRIBUTES_KEY); + + xar_subdoc_prop_set(attributes, MAJOR_DIFF_VERSION_KEY, [[NSString stringWithFormat:@"%u", majorVersion] UTF8String]); + xar_subdoc_prop_set(attributes, MINOR_DIFF_VERSION_KEY, [[NSString stringWithFormat:@"%u", minorVersion] UTF8String]); + + // Version 1 patches don't have a major or minor version field, so we need to differentiate between the hash keys + const char *beforeHashKey = + MAJOR_VERSION_IS_AT_LEAST(majorVersion, SUBeigeMajorVersion) ? BEFORE_TREE_SHA1_KEY : BEFORE_TREE_SHA1_OLD_KEY; + const char *afterHashKey = + MAJOR_VERSION_IS_AT_LEAST(majorVersion, SUBeigeMajorVersion) ? AFTER_TREE_SHA1_KEY : AFTER_TREE_SHA1_OLD_KEY; + + xar_subdoc_prop_set(attributes, beforeHashKey, [beforeHash UTF8String]); + xar_subdoc_prop_set(attributes, afterHashKey, [afterHash UTF8String]); + + NSOperationQueue *deltaQueue = [[NSOperationQueue alloc] init]; + NSMutableArray *deltaOperations = [NSMutableArray array]; + + // Sort the keys by preferring the ones from the original tree to appear first + // We want to enforce deleting before extracting in the case paths differ only by case + NSArray *keys = [[newTreeState allKeys] sortedArrayUsingComparator:^NSComparisonResult(NSString *key1, NSString *key2) { + NSComparisonResult insensitiveCompareResult = [key1 caseInsensitiveCompare:key2]; + if (insensitiveCompareResult != NSOrderedSame) { + return insensitiveCompareResult; + } + + return originalTreeState[key1] ? NSOrderedAscending : NSOrderedDescending; + }]; + for (NSString* key in keys) { + id value = [newTreeState valueForKey:key]; + + if ([value isEqual:[NSNull null]]) { + xar_file_t newFile = xar_add_frombuffer(x, 0, [key fileSystemRepresentation], (char *)"", 1); + assert(newFile); + xar_prop_set(newFile, DELETE_KEY, "true"); + + if (verbose) { + fprintf(stderr, "\n❌ %s %s", VERBOSE_REMOVED, [key fileSystemRepresentation]); + } + continue; + } + + NSDictionary *originalInfo = originalTreeState[key]; + NSDictionary *newInfo = newTreeState[key]; + if (shouldSkipDeltaCompression(originalInfo, newInfo)) { + if (MAJOR_VERSION_IS_AT_LEAST(majorVersion, SUBeigeMajorVersion) && shouldSkipExtracting(originalInfo, newInfo)) { + if (shouldChangePermissions(originalInfo, newInfo)) { + xar_file_t newFile = xar_add_frombuffer(x, 0, [key fileSystemRepresentation], (char *)"", 1); + assert(newFile); + xar_prop_set(newFile, MODIFY_PERMISSIONS_KEY, [[NSString stringWithFormat:@"%u", [newInfo[INFO_PERMISSIONS_KEY] unsignedShortValue]] UTF8String]); + + if (verbose) { + fprintf(stderr, "\n👮 %s %s (0%o -> 0%o)", VERBOSE_MODIFIED, [key fileSystemRepresentation], [originalInfo[INFO_PERMISSIONS_KEY] unsignedShortValue], [newInfo[INFO_PERMISSIONS_KEY] unsignedShortValue]); + } + } + } else { + NSString *path = [destination stringByAppendingPathComponent:key]; + xar_file_t newFile = xar_add_frompath(x, 0, [key fileSystemRepresentation], [path fileSystemRepresentation]); + assert(newFile); + + if (shouldDeleteThenExtract(originalInfo, newInfo)) { + if (MAJOR_VERSION_IS_AT_LEAST(majorVersion, SUBeigeMajorVersion)) { + xar_prop_set(newFile, DELETE_KEY, "true"); + } else { + xar_prop_set(newFile, DELETE_THEN_EXTRACT_OLD_KEY, "true"); + } + } + + if (MAJOR_VERSION_IS_AT_LEAST(majorVersion, SUBeigeMajorVersion)) { + xar_prop_set(newFile, EXTRACT_KEY, "true"); + } + + if (verbose) { + if (originalInfo) { + fprintf(stderr, "\n✏️ %s %s", VERBOSE_UPDATED, [key fileSystemRepresentation]); + } else { + fprintf(stderr, "\n✅ %s %s", VERBOSE_ADDED, [key fileSystemRepresentation]); + } + } + } + } else { + NSNumber *permissions = + (MAJOR_VERSION_IS_AT_LEAST(majorVersion, SUBeigeMajorVersion) && shouldChangePermissions(originalInfo, newInfo)) ? + newInfo[INFO_PERMISSIONS_KEY] : + nil; + CreateBinaryDeltaOperation *operation = [[CreateBinaryDeltaOperation alloc] initWithRelativePath:key oldTree:source newTree:destination oldPermissions:originalInfo[INFO_PERMISSIONS_KEY] newPermissions:permissions]; + [deltaQueue addOperation:operation]; + [deltaOperations addObject:operation]; + } + } + + [deltaQueue waitUntilAllOperationsAreFinished]; + + for (CreateBinaryDeltaOperation *operation in deltaOperations) { + NSString *resultPath = [operation resultPath]; + if (!resultPath) { + fprintf(stderr, "\nFailed to create patch from source %s and destination %s\n", [[operation relativePath] fileSystemRepresentation], [resultPath fileSystemRepresentation]); + return 1; + } + + if (verbose) { + fprintf(stderr, "\n🔨 %s %s", VERBOSE_DIFFED, [[operation relativePath] fileSystemRepresentation]); + } + + xar_file_t newFile = xar_add_frompath(x, 0, [[operation relativePath] fileSystemRepresentation], [resultPath fileSystemRepresentation]); + assert(newFile); + xar_prop_set(newFile, BINARY_DELTA_KEY, "true"); + unlink([resultPath fileSystemRepresentation]); + + if (operation.permissions) { + xar_prop_set(newFile, MODIFY_PERMISSIONS_KEY, [[NSString stringWithFormat:@"%u", [operation.permissions unsignedShortValue]] UTF8String]); + + if (verbose) { + fprintf(stderr, "\n👮 %s %s (0%o -> 0%o)", VERBOSE_MODIFIED, [[operation relativePath] fileSystemRepresentation], operation.oldPermissions.unsignedShortValue, operation.permissions.unsignedShortValue); + } + } + } + + xar_close(x); + + unlink([patchFile fileSystemRepresentation]); + link([temporaryFile fileSystemRepresentation], [patchFile fileSystemRepresentation]); + unlink([temporaryFile fileSystemRepresentation]); + + if (verbose) { + fprintf(stderr, "\nDone!\n"); + } + + return 0; +} diff --git a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaTool.m b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaTool.m index a09d8c6d5..804663dd8 100644 --- a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaTool.m +++ b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaTool.m @@ -6,275 +6,213 @@ // Copyright 2009 Mark Rowe. All rights reserved. // -#define _DARWIN_NO_64_BIT_INODE 1 - -#include "SUBinaryDeltaCommon.h" #include "SUBinaryDeltaApply.h" -#include +#include "SUBinaryDeltaCreate.h" +#import "SUBinaryDeltaCommon.h" #include -#include -#include -#include -#include -#include -#include -#include -#include #include -extern int bsdiff(int argc, const char **argv); +#define VERBOSE_FLAG @"--verbose" +#define VERSION_FLAG @"--version" -@interface CreateBinaryDeltaOperation : NSOperation -@property (copy) NSString *relativePath; -@property (strong) NSString *resultPath; -@property (strong) NSString *_fromPath; -@property (strong) NSString *_toPath; -- (id)initWithRelativePath:(NSString *)relativePath oldTree:(NSString *)oldTree newTree:(NSString *)newTree; -@end +#define CREATE_COMMAND @"create" +#define APPLY_COMMAND @"apply" +#define VERSION_COMMAND @"version" +#define VERSION_ALTERNATE_COMMAND @"--version" -@implementation CreateBinaryDeltaOperation -@synthesize relativePath = _relativePath; -@synthesize resultPath = _resultPath; -@synthesize _fromPath = _fromPath; -@synthesize _toPath = _toPath; - -- (id)initWithRelativePath:(NSString *)relativePath oldTree:(NSString *)oldTree newTree:(NSString *)newTree +static void printUsage(NSString *programName) { - if ((self = [super init])) { - self.relativePath = relativePath; - self._fromPath = [oldTree stringByAppendingPathComponent:relativePath]; - self._toPath = [newTree stringByAppendingPathComponent:relativePath]; + fprintf(stderr, "Usage:\n"); + fprintf(stderr, "%s create [--verbose] [--version=] \n", [programName UTF8String]); + fprintf(stderr, "%s apply [--verbose] \n", [programName UTF8String]); + fprintf(stderr, "%s version []\n", [programName UTF8String]); +} + +static int runCreateCommand(NSString *programName, NSArray *args) +{ + if (args.count < 3 || args.count > 5) { + printUsage(programName); + return 1; } - return self; + + NSUInteger numberOflagsFound = 0; + NSUInteger verboseIndex = [args indexOfObject:VERBOSE_FLAG]; + NSUInteger versionIndex = NSNotFound; + for (NSUInteger argumentIndex = 0; argumentIndex < args.count; ++argumentIndex) { + if ([args[argumentIndex] hasPrefix:VERSION_FLAG]) { + versionIndex = argumentIndex; + break; + } + } + + if (verboseIndex != NSNotFound) { + ++numberOflagsFound; + } + if (versionIndex != NSNotFound) { + ++numberOflagsFound; + } + + if (args.count - numberOflagsFound < 3) { + printUsage(programName); + return 1; + } + + BOOL verbose = (verboseIndex != NSNotFound); + NSString *versionField = (versionIndex != NSNotFound) ? args[versionIndex] : nil; + + NSArray *versionComponents = nil; + if (versionField) { + versionComponents = [versionField componentsSeparatedByString:@"="]; + if (versionComponents.count != 2) { + printUsage(programName); + return 1; + } + } + + SUBinaryDeltaMajorVersion patchVersion = + !versionComponents ? + LATEST_DELTA_DIFF_MAJOR_VERSION : + (SUBinaryDeltaMajorVersion)[[versionComponents[1] componentsSeparatedByString:@"."][0] intValue]; // ignore minor version if provided + + NSMutableArray *fileArgs = [NSMutableArray array]; + for (NSString *argument in args) { + if (![argument hasPrefix:VERSION_FLAG] && ![argument isEqualToString:VERBOSE_FLAG]) { + [fileArgs addObject:argument]; + } + } + + if (fileArgs.count != 3) { + printUsage(programName); + return 1; + } + + BOOL isDirectory; + if (![[NSFileManager defaultManager] fileExistsAtPath:fileArgs[0] isDirectory:&isDirectory] || !isDirectory) { + printUsage(programName); + fprintf(stderr, "Error: before-tree must be a directory\n"); + return 1; + } + + if (![[NSFileManager defaultManager] fileExistsAtPath:fileArgs[1] isDirectory:&isDirectory] || !isDirectory) { + printUsage(programName); + fprintf(stderr, "Error: after-tree must be a directory\n"); + return 1; + } + + return createBinaryDelta(fileArgs[0], fileArgs[1], fileArgs[2], patchVersion, verbose); } -- (void)main +static int runApplyCommand(NSString *programName, NSArray *args) { - NSString *temporaryFile = temporaryFilename(@"BinaryDelta"); - const char *argv[] = {"/usr/bin/bsdiff", [self._fromPath fileSystemRepresentation], [self._toPath fileSystemRepresentation], [temporaryFile fileSystemRepresentation]}; - int result = bsdiff(4, argv); - if (!result) - self.resultPath = temporaryFile; + if (args.count < 3 || args.count > 4) { + printUsage(programName); + return 1; + } + + BOOL verbose = [args containsObject:VERBOSE_FLAG]; + + if (args.count == 4 && !verbose) { + printUsage(programName); + return 1; + } + + NSMutableArray *fileArgs = [NSMutableArray array]; + for (NSString *argument in args) { + if (![argument isEqualToString:VERBOSE_FLAG]) { + [fileArgs addObject:argument]; + } + } + + if (fileArgs.count != 3) { + printUsage(programName); + return 1; + } + + BOOL isDirectory; + if (![[NSFileManager defaultManager] fileExistsAtPath:fileArgs[0] isDirectory:&isDirectory] || !isDirectory) { + printUsage(programName); + fprintf(stderr, "Error: before-tree must be a directory\n"); + return 1; + } + + if (![[NSFileManager defaultManager] fileExistsAtPath:fileArgs[2] isDirectory:&isDirectory] || isDirectory) { + printUsage(programName); + fprintf(stderr, "Error: patch-file must be a file %d\n", isDirectory); + return 1; + } + + return applyBinaryDelta(fileArgs[0], fileArgs[1], fileArgs[2], verbose); } -@end - -static NSDictionary *infoForFile(FTSENT *ent) +static int runVersionCommand(NSString *programName, NSArray *args) { - NSData *hash = hashOfFile(ent); - NSNumber *size = @0; - if (ent->fts_info != FTS_D) { - size = @(ent->fts_statp->st_size); - } - return @{@"hash": hash, @"type": @(ent->fts_info), @"size": size}; -} - -static NSString *absolutePath(NSString *path) -{ - NSURL *url = [[NSURL alloc] initFileURLWithPath:path]; - return [[url absoluteURL] path]; -} - -static NSString *temporaryPatchFile(NSString *patchFile) -{ - NSString *path = absolutePath(patchFile); - NSString *directory = [path stringByDeletingLastPathComponent]; - NSString *file = [path lastPathComponent]; - return [NSString stringWithFormat:@"%@/.%@.tmp", directory, file]; -} - -static BOOL shouldSkipDeltaCompression(NSString * __unused key, NSDictionary* originalInfo, NSDictionary *newInfo) -{ - unsigned long long fileSize = [newInfo[@"size"] unsignedLongLongValue]; - if (fileSize < 4096) { - return YES; - } - - if (!originalInfo) { - return YES; - } - - if ([originalInfo[@"type"] unsignedShortValue] != [newInfo[@"type"] unsignedShortValue]) { - return YES; - } - - return NO; -} - -static BOOL shouldDeleteThenExtract(NSString * __unused key, NSDictionary* originalInfo, NSDictionary *newInfo) -{ - if (!originalInfo) { - return NO; - } - - if ([originalInfo[@"type"] unsignedShortValue] != [newInfo[@"type"] unsignedShortValue]) { - return YES; - } - - return NO; + if (args.count > 1) { + printUsage(programName); + return 1; + } + + if (args.count == 0) { + fprintf(stdout, "%u.%u\n", LATEST_DELTA_DIFF_MAJOR_VERSION, latestMinorVersionForMajorVersion(LATEST_DELTA_DIFF_MAJOR_VERSION)); + } else { + NSString *patchFile = args[0]; + xar_t x = xar_open([patchFile fileSystemRepresentation], READ); + if (!x) { + fprintf(stderr, "Unable to open patch %s\n", [patchFile fileSystemRepresentation]); + return 1; + } + + SUBinaryDeltaMajorVersion majorDiffVersion = FIRST_DELTA_DIFF_MAJOR_VERSION; + SUBinaryDeltaMinorVersion minorDiffVersion = FIRST_DELTA_DIFF_MINOR_VERSION; + + xar_subdoc_t subdoc; + for (subdoc = xar_subdoc_first(x); subdoc; subdoc = xar_subdoc_next(subdoc)) { + if (!strcmp(xar_subdoc_name(subdoc), BINARY_DELTA_ATTRIBUTES_KEY)) { + const char *value = 0; + + // available in version 2.0 or later + xar_subdoc_prop_get(subdoc, MAJOR_DIFF_VERSION_KEY, &value); + if (value) + majorDiffVersion = (SUBinaryDeltaMajorVersion)[@(value) intValue]; + + // available in version 2.0 or later + xar_subdoc_prop_get(subdoc, MINOR_DIFF_VERSION_KEY, &value); + if (value) + minorDiffVersion = (SUBinaryDeltaMinorVersion)[@(value) intValue]; + } + } + + fprintf(stdout, "%u.%u\n", majorDiffVersion, minorDiffVersion); + } + + return 0; } int main(int __unused argc, char __unused *argv[]) { @autoreleasepool { NSArray *args = [[NSProcessInfo processInfo] arguments]; - if (args.count != 5) { - usage: - fprintf(stderr, "Usage: BinaryDelta [create | apply] before-tree after-tree patch-file\n"); + NSString *programName = [args[0] lastPathComponent]; + + if (args.count < 2) { + printUsage(programName); return 1; } NSString *command = args[1]; - NSString *oldPath = args[2]; - NSString *newPath = args[3]; - NSString *patchFile = args[4]; - - BOOL isDirectory; - [[NSFileManager defaultManager] fileExistsAtPath:oldPath isDirectory:&isDirectory]; - if (!isDirectory) { - fprintf(stderr, "Usage: before-tree must be a directory\n"); - return 1; + NSArray *commandArguments = [args subarrayWithRange:NSMakeRange(2, args.count - 2)]; + + int result; + if ([command isEqualToString:CREATE_COMMAND]) { + result = runCreateCommand(programName, commandArguments); + } else if ([command isEqualToString:APPLY_COMMAND]) { + result = runApplyCommand(programName, commandArguments); + } else if ([command isEqualToString:VERSION_COMMAND] || [command isEqualToString:VERSION_ALTERNATE_COMMAND]) { + result = runVersionCommand(programName, commandArguments); + } else { + result = 1; + printUsage(programName); } - - [[NSFileManager defaultManager] fileExistsAtPath:newPath isDirectory:&isDirectory]; - if (!isDirectory) { - fprintf(stderr, "Usage: after-tree must be a directory\n"); - return 1; - } - - if ([command isEqualToString:@"apply"]) { - int result = applyBinaryDelta(oldPath, newPath, patchFile); - return result; - } - if (![command isEqualToString:@"create"]) { - goto usage; - } - - NSMutableDictionary *originalTreeState = [NSMutableDictionary dictionary]; - - const char *sourcePaths[] = {[oldPath fileSystemRepresentation], 0}; - FTS *fts = fts_open((char* const*)sourcePaths, FTS_PHYSICAL | FTS_NOCHDIR, compareFiles); - if (!fts) { - perror("fts_open"); - return 1; - } - - fprintf(stderr, "Processing %s...", [oldPath UTF8String]); - FTSENT *ent = 0; - while ((ent = fts_read(fts))) { - if (ent->fts_info != FTS_F && ent->fts_info != FTS_SL && ent->fts_info != FTS_D) { - continue; - } - - NSString *key = pathRelativeToDirectory(oldPath, stringWithFileSystemRepresentation(ent->fts_path)); - if (![key length]) { - continue; - } - - NSDictionary *info = infoForFile(ent); - originalTreeState[key] = info; - } - fts_close(fts); - - NSString *beforeHash = hashOfTree(oldPath); - - NSMutableDictionary *newTreeState = [NSMutableDictionary dictionary]; - for (NSString *key in originalTreeState) - { - newTreeState[key] = [NSNull null]; - } - - fprintf(stderr, "\nProcessing %s... ", [newPath UTF8String]); - sourcePaths[0] = [newPath fileSystemRepresentation]; - fts = fts_open((char* const*)sourcePaths, FTS_PHYSICAL | FTS_NOCHDIR, compareFiles); - if (!fts) { - perror("fts_open"); - return 1; - } - - - while ((ent = fts_read(fts))) { - if (ent->fts_info != FTS_F && ent->fts_info != FTS_SL && ent->fts_info != FTS_D) { - continue; - } - - NSString *key = pathRelativeToDirectory(newPath, stringWithFileSystemRepresentation(ent->fts_path)); - if (![key length]) { - continue; - } - - NSDictionary *info = infoForFile(ent); - NSDictionary *oldInfo = originalTreeState[key]; - - if ([info isEqual:oldInfo]) - [newTreeState removeObjectForKey:key]; - else - newTreeState[key] = info; - } - fts_close(fts); - - NSString *afterHash = hashOfTree(newPath); - - fprintf(stderr, "\nGenerating delta... "); - - NSString *temporaryFile = temporaryPatchFile(patchFile); - xar_t x = xar_open([temporaryFile fileSystemRepresentation], WRITE); - xar_opt_set(x, XAR_OPT_COMPRESSION, "bzip2"); - xar_subdoc_t attributes = xar_subdoc_new(x, "binary-delta-attributes"); - xar_subdoc_prop_set(attributes, "before-sha1", [beforeHash UTF8String]); - xar_subdoc_prop_set(attributes, "after-sha1", [afterHash UTF8String]); - - NSOperationQueue *deltaQueue = [[NSOperationQueue alloc] init]; - NSMutableArray *deltaOperations = [NSMutableArray array]; - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wselector" - // Xcode 5.1.1: compare: is clearly declared, must warn due to a compiler bug? - NSArray *keys = [[newTreeState allKeys] sortedArrayUsingSelector:@selector(compare:)]; -#pragma clang diagnostic pop - for (NSString* key in keys) { - id value = [newTreeState valueForKey:key]; - - if ([value isEqual:[NSNull null]]) { - xar_file_t newFile = xar_add_frombuffer(x, 0, [key fileSystemRepresentation], (char *)"", 1); - assert(newFile); - xar_prop_set(newFile, "delete", "true"); - continue; - } - - NSDictionary *originalInfo = originalTreeState[key]; - NSDictionary *newInfo = newTreeState[key]; - if (shouldSkipDeltaCompression(key, originalInfo, newInfo)) { - NSString *path = [newPath stringByAppendingPathComponent:key]; - xar_file_t newFile = xar_add_frompath(x, 0, [key fileSystemRepresentation], [path fileSystemRepresentation]); - assert(newFile); - if (shouldDeleteThenExtract(key, originalInfo, newInfo)) { - xar_prop_set(newFile, "delete-then-extract", "true"); - } - } else { - CreateBinaryDeltaOperation *operation = [[CreateBinaryDeltaOperation alloc] initWithRelativePath:key oldTree:oldPath newTree:newPath]; - [deltaQueue addOperation:operation]; - [deltaOperations addObject:operation]; - } - } - - [deltaQueue waitUntilAllOperationsAreFinished]; - - for (CreateBinaryDeltaOperation *operation in deltaOperations) { - NSString *resultPath = [operation resultPath]; - xar_file_t newFile = xar_add_frompath(x, 0, [[operation relativePath] fileSystemRepresentation], [resultPath fileSystemRepresentation]); - assert(newFile); - xar_prop_set(newFile, "binary-delta", "true"); - unlink([resultPath fileSystemRepresentation]); - } - - xar_close(x); - - unlink([patchFile fileSystemRepresentation]); - link([temporaryFile fileSystemRepresentation], [patchFile fileSystemRepresentation]); - unlink([temporaryFile fileSystemRepresentation]); - fprintf(stderr, "Done!\n"); - - return 0; + + return result; } } diff --git a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaUnarchiver.m b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaUnarchiver.m index df8b67ef2..0c238df7f 100644 --- a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaUnarchiver.m +++ b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaUnarchiver.m @@ -17,16 +17,16 @@ + (BOOL)canUnarchivePath:(NSString *)path { - return binaryDeltaSupported() && [[path pathExtension] isEqualToString:@"delta"]; + return [[path pathExtension] isEqualToString:@"delta"]; } - (void)applyBinaryDelta { @autoreleasepool { - NSString *sourcePath = [[self.updateHost bundle] bundlePath]; + NSString *sourcePath = self.updateHostBundlePath; NSString *targetPath = [[self.archivePath stringByDeletingLastPathComponent] stringByAppendingPathComponent:[sourcePath lastPathComponent]]; - int result = applyBinaryDelta(sourcePath, targetPath, self.archivePath); + int result = applyBinaryDelta(sourcePath, targetPath, self.archivePath, NO); if (!result) { dispatch_async(dispatch_get_main_queue(), ^{ [self notifyDelegateOfSuccess]; diff --git a/Frameworks/Sparkle/Sparkle/SUCodeSigningVerifier.h b/Frameworks/Sparkle/Sparkle/SUCodeSigningVerifier.h index 1f01d1b55..eddd1b261 100644 --- a/Frameworks/Sparkle/Sparkle/SUCodeSigningVerifier.h +++ b/Frameworks/Sparkle/Sparkle/SUCodeSigningVerifier.h @@ -12,8 +12,10 @@ #import @interface SUCodeSigningVerifier : NSObject -+ (BOOL)codeSignatureIsValidAtPath:(NSString *)destinationPath error:(NSError **)error; ++ (BOOL)codeSignatureMatchesHostAndIsValidAtPath:(NSString *)applicationPath error:(NSError **)error; ++ (BOOL)codeSignatureIsValidAtPath:(NSString *)applicationPath error:(NSError **)error; + (BOOL)hostApplicationIsCodeSigned; ++ (BOOL)applicationAtPathIsCodeSigned:(NSString *)applicationPath; @end #endif diff --git a/Frameworks/Sparkle/Sparkle/SUCodeSigningVerifier.m b/Frameworks/Sparkle/Sparkle/SUCodeSigningVerifier.m index 692865928..73efc6c11 100644 --- a/Frameworks/Sparkle/Sparkle/SUCodeSigningVerifier.m +++ b/Frameworks/Sparkle/Sparkle/SUCodeSigningVerifier.m @@ -13,7 +13,7 @@ @implementation SUCodeSigningVerifier -+ (BOOL)codeSignatureIsValidAtPath:(NSString *)destinationPath error:(NSError *__autoreleasing *)error ++ (BOOL)codeSignatureMatchesHostAndIsValidAtPath:(NSString *)applicationPath error:(NSError *__autoreleasing *)error { OSStatus result; SecRequirementRef requirement = NULL; @@ -37,20 +37,23 @@ goto finally; } - newBundle = [NSBundle bundleWithPath:destinationPath]; + newBundle = [NSBundle bundleWithPath:applicationPath]; if (!newBundle) { SULog(@"Failed to load NSBundle for update"); result = -1; goto finally; } - result = SecStaticCodeCreateWithPath((__bridge CFURLRef)[newBundle executableURL], kSecCSDefaultFlags, &staticCode); + result = SecStaticCodeCreateWithPath((__bridge CFURLRef)[newBundle bundleURL], kSecCSDefaultFlags, &staticCode); if (result != noErr) { SULog(@"Failed to get static code %d", result); goto finally; } - result = SecStaticCodeCheckValidityWithErrors(staticCode, kSecCSDefaultFlags | kSecCSCheckAllArchitectures, requirement, &cfError); + // Note that kSecCSCheckNestedCode may not work with pre-Mavericks code signing. + // See https://github.com/sparkle-project/Sparkle/issues/376#issuecomment-48824267 and https://developer.apple.com/library/mac/technotes/tn2206 + SecCSFlags flags = kSecCSDefaultFlags | kSecCSCheckAllArchitectures; + result = SecStaticCodeCheckValidityWithErrors(staticCode, flags, requirement, &cfError); if (cfError) { NSError *tmpError = CFBridgingRelease(cfError); @@ -80,6 +83,53 @@ finally: return (result == noErr); } ++ (BOOL)codeSignatureIsValidAtPath:(NSString *)applicationPath error:(NSError *__autoreleasing *)error +{ + OSStatus result; + SecStaticCodeRef staticCode = NULL; + NSBundle *newBundle; + CFErrorRef cfError = NULL; + if (error) { + *error = nil; + } + + newBundle = [NSBundle bundleWithPath:applicationPath]; + if (!newBundle) { + SULog(@"Failed to load NSBundle"); + result = -1; + goto finally; + } + + result = SecStaticCodeCreateWithPath((__bridge CFURLRef)[newBundle bundleURL], kSecCSDefaultFlags, &staticCode); + if (result != noErr) { + SULog(@"Failed to get static code %d", result); + goto finally; + } + + // Note that kSecCSCheckNestedCode may not work with pre-Mavericks code signing. + // See https://github.com/sparkle-project/Sparkle/issues/376#issuecomment-48824267 and https://developer.apple.com/library/mac/technotes/tn2206 + SecCSFlags flags = kSecCSDefaultFlags | kSecCSCheckAllArchitectures; + result = SecStaticCodeCheckValidityWithErrors(staticCode, flags, NULL, &cfError); + + if (cfError) { + NSError *tmpError = CFBridgingRelease(cfError); + if (error) *error = tmpError; + } + + if (result != noErr) { + if (result == errSecCSUnsigned) { + SULog(@"Error: The app is not signed using Apple Code Signing. %@", applicationPath); + } + if (result == errSecCSReqFailed) { + [self logSigningInfoForCode:staticCode label:@"new info"]; + } + } + +finally: + if (staticCode) CFRelease(staticCode); + return (result == noErr); +} + static id valueOrNSNull(id value) { return value ? value : [NSNull null]; } @@ -114,4 +164,35 @@ static id valueOrNSNull(id value) { return (result == 0); } ++ (BOOL)applicationAtPathIsCodeSigned:(NSString *)applicationPath +{ + OSStatus result; + SecStaticCodeRef staticCode = NULL; + NSBundle *newBundle; + + newBundle = [NSBundle bundleWithPath:applicationPath]; + if (!newBundle) { + SULog(@"Failed to load NSBundle"); + return NO; + } + + result = SecStaticCodeCreateWithPath((__bridge CFURLRef)[newBundle bundleURL], kSecCSDefaultFlags, &staticCode); + if (result == errSecCSUnsigned) { + return NO; + } + + SecRequirementRef requirement = NULL; + result = SecCodeCopyDesignatedRequirement(staticCode, kSecCSDefaultFlags, &requirement); + if (staticCode) { + CFRelease(staticCode); + } + if (requirement) { + CFRelease(requirement); + } + if (result == errSecCSUnsigned) { + return NO; + } + return (result == 0); +} + @end diff --git a/Frameworks/Sparkle/Sparkle/SUConstants.h b/Frameworks/Sparkle/Sparkle/SUConstants.h index d9d7887bf..e6bfcb31c 100644 --- a/Frameworks/Sparkle/Sparkle/SUConstants.h +++ b/Frameworks/Sparkle/Sparkle/SUConstants.h @@ -79,33 +79,4 @@ extern NSString *const SURSSElementLink; extern NSString *const SURSSElementPubDate; extern NSString *const SURSSElementTitle; -// ----------------------------------------------------------------------------- -// Errors: -// ----------------------------------------------------------------------------- - -extern NSString *const SUSparkleErrorDomain; -typedef NS_ENUM(OSStatus, SUError) { - // Appcast phase errors. - SUAppcastParseError = 1000, - SUNoUpdateError = 1001, - SUAppcastError = 1002, - SURunningFromDiskImageError = 1003, - - // Downlaod phase errors. - SUTemporaryDirectoryError = 2000, - - // Extraction phase errors. - SUUnarchivingError = 3000, - SUSignatureError = 3001, - - // Installation phase errors. - SUFileCopyFailure = 4000, - SUAuthenticationFailure = 4001, - SUMissingUpdateError = 4002, - SUMissingInstallerToolError = 4003, - SURelaunchError = 4004, - SUInstallationError = 4005, - SUDowngradeError = 4006 -}; - #endif diff --git a/Frameworks/Sparkle/Sparkle/SUErrors.h b/Frameworks/Sparkle/Sparkle/SUErrors.h new file mode 100644 index 000000000..e624bb056 --- /dev/null +++ b/Frameworks/Sparkle/Sparkle/SUErrors.h @@ -0,0 +1,44 @@ +// +// SUErrors.h +// Sparkle +// +// Created by C.W. Betts on 10/13/14. +// Copyright (c) 2014 Sparkle Project. All rights reserved. +// + +#ifndef SUERRORS_H +#define SUERRORS_H + +#import +#import "SUExport.h" + +/** + * Error domain used by Sparkle + */ +SU_EXPORT extern NSString *const SUSparkleErrorDomain; + +typedef NS_ENUM(OSStatus, SUError) { + // Appcast phase errors. + SUAppcastParseError = 1000, + SUNoUpdateError = 1001, + SUAppcastError = 1002, + SURunningFromDiskImageError = 1003, + + // Downlaod phase errors. + SUTemporaryDirectoryError = 2000, + + // Extraction phase errors. + SUUnarchivingError = 3000, + SUSignatureError = 3001, + + // Installation phase errors. + SUFileCopyFailure = 4000, + SUAuthenticationFailure = 4001, + SUMissingUpdateError = 4002, + SUMissingInstallerToolError = 4003, + SURelaunchError = 4004, + SUInstallationError = 4005, + SUDowngradeError = 4006 +}; + +#endif diff --git a/Frameworks/Sparkle/Sparkle/SUGuidedPackageInstaller.h b/Frameworks/Sparkle/Sparkle/SUGuidedPackageInstaller.h new file mode 100644 index 000000000..92082a340 --- /dev/null +++ b/Frameworks/Sparkle/Sparkle/SUGuidedPackageInstaller.h @@ -0,0 +1,35 @@ +// +// SUGuidedPackageInstaller.h +// Sparkle +// +// Created by Graham Miln on 14/05/2010. +// Copyright 2010 Dragon Systems Software Limited. All rights reserved. +// + +/*! +# Sparkle Guided Installations + +A guided installation allows Sparkle to download and install a package (pkg) or multi-package (mpkg) without user interaction. + +The installer package is installed using Mac OS X's built-in command line installer, `/usr/sbin/installer`. No installation interface is shown to the user. + +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. + +## To Do +- Replace the use of `AuthorizationExecuteWithPrivilegesAndWait`. This method remains because it is well supported and tested. Ideally a helper tool or XPC would be used. +*/ + +#ifndef SUGUIDEDPACKAGEINSTALLER_H +#define SUGUIDEDPACKAGEINSTALLER_H + +#import "Sparkle.h" +#import "SUInstaller.h" + +@interface SUGuidedPackageInstaller : SUInstaller { +} + +/*! Perform the guided installation */ ++ (void)performInstallationToPath:(NSString *)path fromPath:(NSString *)installerGuide host:(SUHost *)host versionComparator:(id)comparator completionHandler:(void (^)(NSError *))completionHandler; +@end + +#endif diff --git a/Frameworks/Sparkle/Sparkle/SUGuidedPackageInstaller.m b/Frameworks/Sparkle/Sparkle/SUGuidedPackageInstaller.m new file mode 100644 index 000000000..bc83d42be --- /dev/null +++ b/Frameworks/Sparkle/Sparkle/SUGuidedPackageInstaller.m @@ -0,0 +1,139 @@ +// +// SUGuidedPackageInstaller.m +// Sparkle +// +// Created by Graham Miln on 14/05/2010. +// Copyright 2010 Dragon Systems Software Limited. All rights reserved. +// + +#import +#import + +#import "SUGuidedPackageInstaller.h" + +static BOOL AuthorizationExecuteWithPrivilegesAndWait(AuthorizationRef authorization, const char* executablePath, AuthorizationFlags options, const char* const* arguments) +{ + sig_t oldSigChildHandler = signal(SIGCHLD, SIG_DFL); + BOOL returnValue = YES; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + /* AuthorizationExecuteWithPrivileges used to support 10.4+; should be replaced with XPC or external process */ + if (AuthorizationExecuteWithPrivileges(authorization, executablePath, options, (char* const*)arguments, NULL) == errAuthorizationSuccess) +#pragma clang diagnostic pop + { + int status = 0; + pid_t pid = wait(&status); + if (pid == -1 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) + returnValue = NO; + } + else + returnValue = NO; + + signal(SIGCHLD, oldSigChildHandler); + return returnValue; +} + +@implementation SUGuidedPackageInstaller (SUGuidedPackageInstallerAuthentication) + ++ (AuthorizationRef)authorizationForExecutable:(NSString*)executablePath +{ + NSParameterAssert(executablePath); + + // Get authorization using advice in Apple's Technical Q&A1172 + + // ...create authorization without specific rights + AuthorizationRef auth = NULL; + OSStatus validAuth = AuthorizationCreate(NULL, + kAuthorizationEmptyEnvironment, + kAuthorizationFlagDefaults, + &auth); + // ...then extend authorization with desired rights + if ((validAuth == errAuthorizationSuccess) && + (auth != NULL)) + { + const char* executableFileSystemRepresentation = [executablePath fileSystemRepresentation]; + + // Prepare a right allowing script to execute with privileges + AuthorizationItem right; + memset(&right,0,sizeof(right)); + right.name = kAuthorizationRightExecute; + right.value = (void*) executableFileSystemRepresentation; + right.valueLength = strlen(executableFileSystemRepresentation); + + // Package up the single right + AuthorizationRights rights; + memset(&rights,0,sizeof(rights)); + rights.count = 1; + rights.items = &right; + + // Extend rights to run script + validAuth = AuthorizationCopyRights(auth, + &rights, + kAuthorizationEmptyEnvironment, + kAuthorizationFlagPreAuthorize | + kAuthorizationFlagExtendRights | + kAuthorizationFlagInteractionAllowed, + NULL); + if (validAuth != errAuthorizationSuccess) + { + // Error, clean up authorization + (void) AuthorizationFree(auth,kAuthorizationFlagDefaults); + auth = NULL; + } + } + + return auth; +} + +@end + +@implementation SUGuidedPackageInstaller + ++ (void)performInstallationToPath:(NSString *)destinationPath fromPath:(NSString *)packagePath host:(SUHost *)__unused host versionComparator:(id)__unused comparator completionHandler:(void (^)(NSError *))completionHandler +{ + NSParameterAssert(packagePath); + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + + // Preflight + NSString* installerPath = @"/usr/sbin/installer"; // Mac OS X 10.2+ command line installer tool + NSError* error = nil; + + // Create authorization for installer executable + BOOL validInstallation = NO; + AuthorizationRef auth = [self authorizationForExecutable:installerPath]; + if (auth != NULL) + { + // Permission was granted to execute the installer with privileges + const char* const arguments[] = { + "-pkg", + [packagePath fileSystemRepresentation], + "-target", + "/", + NULL + }; + validInstallation = AuthorizationExecuteWithPrivilegesAndWait(auth, + [installerPath fileSystemRepresentation], + kAuthorizationFlagDefaults, + arguments); + // TODO: wait for communications pipe to close via fileno & CFSocketCreateWithNative + AuthorizationFree(auth,kAuthorizationFlagDefaults); + } + else + { + NSString* errorMessage = [NSString stringWithFormat:@"Sparkle Updater: Script authorization denied."]; + error = [NSError errorWithDomain:SUSparkleErrorDomain code:SUInstallationError userInfo:[NSDictionary dictionaryWithObject:errorMessage forKey:NSLocalizedDescriptionKey]]; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + [self finishInstallationToPath:destinationPath + withResult:validInstallation + error:error + completionHandler:completionHandler]; + + }); + }); +} + +@end diff --git a/Frameworks/Sparkle/Sparkle/SUHost.h b/Frameworks/Sparkle/Sparkle/SUHost.h index 6e4e49f9a..4ec132867 100644 --- a/Frameworks/Sparkle/Sparkle/SUHost.h +++ b/Frameworks/Sparkle/Sparkle/SUHost.h @@ -18,7 +18,7 @@ - (instancetype)initWithBundle:(NSBundle *)aBundle; @property (readonly, copy) NSString *bundlePath; -@property (readonly, copy) NSString *appSupportPath; +@property (readonly, copy) NSString *appCachePath; @property (readonly, copy) NSString *installationPath; @property (readonly, copy) NSString *name; @property (readonly, copy) NSString *version; diff --git a/Frameworks/Sparkle/Sparkle/SUHost.m b/Frameworks/Sparkle/Sparkle/SUHost.m index 58c536513..8f559a87e 100644 --- a/Frameworks/Sparkle/Sparkle/SUHost.m +++ b/Frameworks/Sparkle/Sparkle/SUHost.m @@ -66,21 +66,26 @@ typedef struct { return [self.bundle bundlePath]; } -- (NSString *)appSupportPath +- (NSString *)appCachePath { - NSArray *appSupportPaths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); - NSString *appSupportPath = nil; - if (!appSupportPaths || [appSupportPaths count] == 0) - { - SULog(@"Failed to find app support directory! Using ~/Library/Application Support..."); - appSupportPath = [@"~/Library/Application Support" stringByExpandingTildeInPath]; + NSArray *cachePaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); + NSString *cachePath = nil; + if ([cachePaths count]) { + cachePath = cachePaths[0]; } - else { - appSupportPath = appSupportPaths[0]; + if (!cachePath) { + SULog(@"Failed to find user's cache directory! Using system default"); + cachePath = NSTemporaryDirectory(); } - appSupportPath = [appSupportPath stringByAppendingPathComponent:[self name]]; - appSupportPath = [appSupportPath stringByAppendingPathComponent:@".Sparkle"]; - return appSupportPath; + + NSString *name = [self.bundle bundleIdentifier]; + if (!name) { + name = [self name]; + } + + cachePath = [cachePath stringByAppendingPathComponent:name]; + cachePath = [cachePath stringByAppendingPathComponent:@"Sparkle"]; + return cachePath; } - (NSString *)installationPath @@ -97,7 +102,13 @@ typedef struct { - (NSString *)name { - NSString *name = [self.bundle objectForInfoDictionaryKey:@"CFBundleDisplayName"]; + NSString *name; + + // Allow host bundle to provide a custom name + name = [self objectForInfoDictionaryKey:@"SUBundleName"]; + if (name) return name; + + name = [self.bundle objectForInfoDictionaryKey:@"CFBundleDisplayName"]; if (name) return name; name = [self objectForInfoDictionaryKey:(__bridge NSString *)kCFBundleNameKey]; diff --git a/Frameworks/Sparkle/Sparkle/SUInstaller.h b/Frameworks/Sparkle/Sparkle/SUInstaller.h index c1b01898e..fe82f885f 100644 --- a/Frameworks/Sparkle/Sparkle/SUInstaller.h +++ b/Frameworks/Sparkle/Sparkle/SUInstaller.h @@ -12,21 +12,14 @@ #import #import "SUVersionComparisonProtocol.h" -@protocol SUInstallerDelegate; - @class SUHost; @interface SUInstaller : NSObject + (NSString *)appPathInUpdateFolder:(NSString *)updateFolder forHost:(SUHost *)host; -+ (void)installFromUpdateFolder:(NSString *)updateFolder overHost:(SUHost *)host installationPath:(NSString *)installationPath delegate:(id)delegate versionComparator:(id)comparator; -+ (void)finishInstallationToPath:(NSString *)installationPath withResult:(BOOL)result host:(SUHost *)host error:(NSError *)error delegate:(id)delegate; ++ (void)installFromUpdateFolder:(NSString *)updateFolder overHost:(SUHost *)host installationPath:(NSString *)installationPath versionComparator:(id)comparator completionHandler:(void (^)(NSError *))completionHandler; ++ (void)finishInstallationToPath:(NSString *)installationPath withResult:(BOOL)result error:(NSError *)error completionHandler:(void (^)(NSError *))completionHandler; + (NSString *)updateFolder; @end -@protocol SUInstallerDelegate -- (void)installerFinishedForHost:(SUHost *)host; -- (void)installerForHost:(SUHost *)host failedWithError:(NSError *)error; -@end - #endif diff --git a/Frameworks/Sparkle/Sparkle/SUInstaller.m b/Frameworks/Sparkle/Sparkle/SUInstaller.m index 6eff13942..2513973a9 100644 --- a/Frameworks/Sparkle/Sparkle/SUInstaller.m +++ b/Frameworks/Sparkle/Sparkle/SUInstaller.m @@ -9,11 +9,11 @@ #import "SUInstaller.h" #import "SUPlainInstaller.h" #import "SUPackageInstaller.h" +#import "SUGuidedPackageInstaller.h" #import "SUHost.h" #import "SUConstants.h" #import "SULog.h" - @implementation SUInstaller static NSString *sUpdateFolder = nil; @@ -42,50 +42,49 @@ static NSString *sUpdateFolder = nil; return NO; } -+ (NSString *)installSourcePathInUpdateFolder:(NSString *)inUpdateFolder forHost:(SUHost *)host isPackage:(BOOL *)isPackagePtr ++ (NSString *)installSourcePathInUpdateFolder:(NSString *)inUpdateFolder forHost:(SUHost *)host isPackage:(BOOL *)isPackagePtr isGuided:(BOOL *)isGuidedPtr { + NSParameterAssert(inUpdateFolder); + NSParameterAssert(host); + // Search subdirectories for the application NSString *currentFile, *newAppDownloadPath = nil, *bundleFileName = [[host bundlePath] lastPathComponent], *alternateBundleFileName = [[host name] stringByAppendingPathExtension:[[host bundlePath] pathExtension]]; BOOL isPackage = NO; + BOOL isGuided = NO; NSString *fallbackPackagePath = nil; NSDirectoryEnumerator *dirEnum = [[NSFileManager defaultManager] enumeratorAtPath:inUpdateFolder]; + NSString *bundleFileNameNoExtension = [bundleFileName stringByDeletingPathExtension]; sUpdateFolder = inUpdateFolder; - while ((currentFile = [dirEnum nextObject])) - { + while ((currentFile = [dirEnum nextObject])) { NSString *currentPath = [inUpdateFolder stringByAppendingPathComponent:currentFile]; - if ([[currentFile lastPathComponent] isEqualToString:bundleFileName] || - [[currentFile lastPathComponent] isEqualToString:alternateBundleFileName]) // We found one! + NSString *currentFilename = [currentFile lastPathComponent]; + NSString *currentExtension = [currentFile pathExtension]; + NSString *currentFilenameNoExtension = [currentFilename stringByDeletingPathExtension]; + if ([currentFilename isEqualToString:bundleFileName] || + [currentFilename isEqualToString:alternateBundleFileName]) // We found one! { isPackage = NO; newAppDownloadPath = currentPath; break; - } - else if ([[currentFile pathExtension] isEqualToString:@"pkg"] || - [[currentFile pathExtension] isEqualToString:@"mpkg"]) - { - if ([[[currentFile lastPathComponent] stringByDeletingPathExtension] isEqualToString:[bundleFileName stringByDeletingPathExtension]]) - { + } else if ([currentExtension isEqualToString:@"pkg"] || + [currentExtension isEqualToString:@"mpkg"]) { + if ([currentFilenameNoExtension isEqualToString:bundleFileNameNoExtension]) { isPackage = YES; newAppDownloadPath = currentPath; break; - } - else - { + } else { // Remember any other non-matching packages we have seen should we need to use one of them as a fallback. fallbackPackagePath = currentPath; } - } - else - { + } else { // Try matching on bundle identifiers in case the user has changed the name of the host app NSBundle *incomingBundle = [NSBundle bundleWithPath:currentPath]; - if(incomingBundle && [[incomingBundle bundleIdentifier] isEqualToString:[[host bundle] bundleIdentifier]]) - { + if (incomingBundle && [[incomingBundle bundleIdentifier] isEqualToString:[[host bundle] bundleIdentifier]]) { isPackage = NO; newAppDownloadPath = currentPath; break; @@ -99,35 +98,52 @@ static NSString *sUpdateFolder = nil; // We don't have a valid path. Try to use the fallback package. - if (newAppDownloadPath == nil && fallbackPackagePath != nil) - { + if (newAppDownloadPath == nil && fallbackPackagePath != nil) { isPackage = YES; newAppDownloadPath = fallbackPackagePath; } - if (isPackagePtr) *isPackagePtr = isPackage; + if (isPackage) { + // foo.app -> foo.sparkle_guided.pkg or foo.sparkle_guided.mpkg + if ([[[newAppDownloadPath stringByDeletingPathExtension] pathExtension] isEqualToString:@"sparkle_guided"]) { + isGuided = YES; + } + } + + if (isPackagePtr) + *isPackagePtr = isPackage; + if (isGuidedPtr) + *isGuidedPtr = isGuided; + + if (!newAppDownloadPath) { + SULog(@"Searched %@ for %@.(app|pkg)", inUpdateFolder, bundleFileNameNoExtension); + } return newAppDownloadPath; } + (NSString *)appPathInUpdateFolder:(NSString *)updateFolder forHost:(SUHost *)host { BOOL isPackage = NO; - NSString *path = [self installSourcePathInUpdateFolder:updateFolder forHost:host isPackage:&isPackage]; + NSString *path = [self installSourcePathInUpdateFolder:updateFolder forHost:host isPackage:&isPackage isGuided:nil]; return isPackage ? nil : path; } -+ (void)installFromUpdateFolder:(NSString *)inUpdateFolder overHost:(SUHost *)host installationPath:(NSString *)installationPath delegate:(id)delegate versionComparator:(id)comparator ++ (void)installFromUpdateFolder:(NSString *)inUpdateFolder overHost:(SUHost *)host installationPath:(NSString *)installationPath versionComparator:(id)comparator completionHandler:(void (^)(NSError *))completionHandler { BOOL isPackage = NO; - NSString *newAppDownloadPath = [self installSourcePathInUpdateFolder:inUpdateFolder forHost:host isPackage:&isPackage]; + BOOL isGuided = NO; + NSString *newAppDownloadPath = [self installSourcePathInUpdateFolder:inUpdateFolder forHost:host isPackage:&isPackage isGuided:&isGuided]; - if (newAppDownloadPath == nil) - { - [self finishInstallationToPath:installationPath withResult:NO host:host error:[NSError errorWithDomain:SUSparkleErrorDomain code:SUMissingUpdateError userInfo:@{ NSLocalizedDescriptionKey: @"Couldn't find an appropriate update in the downloaded package." }] delegate:delegate]; - } - else - { - [(isPackage ? [SUPackageInstaller class] : [SUPlainInstaller class])performInstallationToPath:installationPath fromPath:newAppDownloadPath host:host delegate:delegate versionComparator:comparator]; + if (newAppDownloadPath == nil) { + [self finishInstallationToPath:installationPath withResult:NO error:[NSError errorWithDomain:SUSparkleErrorDomain code:SUMissingUpdateError userInfo:@{ NSLocalizedDescriptionKey: @"Couldn't find an appropriate update in the downloaded package." }] completionHandler:completionHandler]; + } else { + if (isPackage && isGuided) { + [SUGuidedPackageInstaller performInstallationToPath:installationPath fromPath:newAppDownloadPath host:host versionComparator:comparator completionHandler:completionHandler]; + } else if (isPackage) { + [SUPackageInstaller performInstallationToPath:installationPath fromPath:newAppDownloadPath host:host versionComparator:comparator completionHandler:completionHandler]; + } else { + [SUPlainInstaller performInstallationToPath:installationPath fromPath:newAppDownloadPath host:host versionComparator:comparator completionHandler:completionHandler]; + } } } @@ -140,8 +156,7 @@ static NSString *sUpdateFolder = nil; NSTask *mdimport = [[NSTask alloc] init]; [mdimport setLaunchPath:@"/usr/bin/mdimport"]; [mdimport setArguments:@[installationPath]]; - @try - { + @try { [mdimport launch]; [mdimport waitUntilExit]; } @@ -152,24 +167,20 @@ static NSString *sUpdateFolder = nil; } } -+ (void)finishInstallationToPath:(NSString *)installationPath withResult:(BOOL)result host:(SUHost *)host error:(NSError *)error delegate:(id)delegate ++ (void)finishInstallationToPath:(NSString *)installationPath withResult:(BOOL)result error:(NSError *)error completionHandler:(void (^)(NSError *))completionHandler { - if (result) - { + if (result) { [self mdimportInstallationPath:installationPath]; - if ([delegate respondsToSelector:@selector(installerFinishedForHost:)]) { - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate installerFinishedForHost:host]; - }); - } - } - else - { - if ([delegate respondsToSelector:@selector(installerForHost:failedWithError:)]) { - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate installerForHost:host failedWithError:error]; - }); + dispatch_async(dispatch_get_main_queue(), ^{ + completionHandler(nil); + }); + } else { + if (!error) { + error = [NSError errorWithDomain:SUSparkleErrorDomain code:SUInstallationError userInfo:nil]; } + dispatch_async(dispatch_get_main_queue(), ^{ + completionHandler(error); + }); } } diff --git a/Frameworks/Sparkle/Sparkle/SULog.h b/Frameworks/Sparkle/Sparkle/SULog.h index e3559b5ea..1693f5355 100644 --- a/Frameworks/Sparkle/Sparkle/SULog.h +++ b/Frameworks/Sparkle/Sparkle/SULog.h @@ -12,7 +12,8 @@ Your tech support will hug you if you tell them about this. */ -#pragma once +#ifndef SULOG_H +#define SULOG_H // ----------------------------------------------------------------------------- // Headers: @@ -28,4 +29,4 @@ void SUClearLog(void); void SULog(NSString *format, ...) NS_FORMAT_FUNCTION(1, 2); - +#endif diff --git a/Frameworks/Sparkle/Sparkle/SULog.m b/Frameworks/Sparkle/Sparkle/SULog.m index 02c3be10c..5941aac7e 100644 --- a/Frameworks/Sparkle/Sparkle/SULog.m +++ b/Frameworks/Sparkle/Sparkle/SULog.m @@ -30,10 +30,6 @@ static NSString *const SULogFilePath = @"~/Library/Logs/SparkleUpdateLog.log"; // // TAKES: // sender - Object that sent this message, typically of type X. -// -// GIVES: -// param - who owns the returned value? -// result - same here. // ----------------------------------------------------------------------------- void SUClearLog(void) @@ -41,6 +37,7 @@ void SUClearLog(void) FILE *logfile = fopen([[SULogFilePath stringByExpandingTildeInPath] fileSystemRepresentation], "w"); if (logfile) { fclose(logfile); + SULog(@"===== %@ =====", [[NSFileManager defaultManager] displayNameAtPath:[[NSBundle mainBundle] bundlePath]]); } } @@ -57,6 +54,12 @@ void SUClearLog(void) void SULog(NSString *format, ...) { + static BOOL loggedYet = NO; + if (!loggedYet) { + loggedYet = YES; + SUClearLog(); + } + va_list ap; va_start(ap, format); NSString *theStr = [[NSString alloc] initWithFormat:format arguments:ap]; diff --git a/Frameworks/Sparkle/Sparkle/SUPackageInstaller.m b/Frameworks/Sparkle/Sparkle/SUPackageInstaller.m index 23ad954f5..64637433c 100644 --- a/Frameworks/Sparkle/Sparkle/SUPackageInstaller.m +++ b/Frameworks/Sparkle/Sparkle/SUPackageInstaller.m @@ -12,7 +12,7 @@ @implementation SUPackageInstaller -+ (void)performInstallationToPath:(NSString *)installationPath fromPath:(NSString *)path host:(SUHost *)host delegate:(id)delegate versionComparator:(id)__unused comparator ++ (void)performInstallationToPath:(NSString *)installationPath fromPath:(NSString *)path host:(SUHost *)__unused host versionComparator:(id)__unused comparator completionHandler:(void (^)(NSError *))completionHandler { // Run installer using the "open" command to ensure it is launched in front of current application. // -W = wait until the app has quit. @@ -23,7 +23,7 @@ if (![[NSFileManager defaultManager] fileExistsAtPath:command]) { NSError *error = [NSError errorWithDomain:SUSparkleErrorDomain code:SUMissingInstallerToolError userInfo:@{ NSLocalizedDescriptionKey: @"Couldn't find Apple's installer tool!" }]; - [self finishInstallationToPath:installationPath withResult:NO host:host error:error delegate:delegate]; + [self finishInstallationToPath:installationPath withResult:NO error:error completionHandler:completionHandler]; return; } @@ -33,7 +33,7 @@ // Known bug: if the installation fails or is canceled, Sparkle goes ahead and restarts, thinking everything is fine. dispatch_async(dispatch_get_main_queue(), ^{ - [self finishInstallationToPath:installationPath withResult:YES host:host error:nil delegate:delegate]; + [self finishInstallationToPath:installationPath withResult:YES error:nil completionHandler:completionHandler]; }); }); } diff --git a/Frameworks/Sparkle/Sparkle/SUPipedUnarchiver.m b/Frameworks/Sparkle/Sparkle/SUPipedUnarchiver.m index 1f2f68eaa..7a65054c1 100644 --- a/Frameworks/Sparkle/Sparkle/SUPipedUnarchiver.m +++ b/Frameworks/Sparkle/Sparkle/SUPipedUnarchiver.m @@ -22,7 +22,10 @@ @".tar.gz": @"extractTGZ", @".tgz": @"extractTGZ", @".tar.bz2": @"extractTBZ", - @".tbz": @"extractTBZ" }; + @".tbz": @"extractTBZ", + @".tar.xz": @"extractTXZ", + @".txz": @"extractTXZ", + @".tar.lzma": @"extractTXZ"}; NSString *lastPathComponent = [path lastPathComponent]; for (NSString *currentType in typeSelectorDictionary) @@ -45,73 +48,69 @@ } // This method abstracts the types that use a command line tool piping data from stdin. -- (void)extractArchivePipingDataToCommand:(NSString *)command +- (void)extractArchivePipingDataToCommand:(NSString *)command args:(NSArray*)args { // *** GETS CALLED ON NON-MAIN THREAD!!! @autoreleasepool { - FILE *fp = NULL, *cmdFP = NULL; - char *oldDestinationString = NULL; - // We have to declare these before a goto to prevent an error under ARC. - // No, we cannot have them in the dispatch_async calls, as the goto "jump enters - // lifetime of block which strongly captures a variable" - dispatch_block_t delegateSuccess = ^{ - [self notifyDelegateOfSuccess]; - }; - dispatch_block_t delegateFailure = ^{ - [self notifyDelegateOfFailure]; - }; - SULog(@"Extracting %@ using '%@'", self.archivePath, command); + NSString *destination = [self.archivePath stringByDeletingLastPathComponent]; + + SULog(@"Extracting using '%@' '%@' < '%@' '%@'", command, [args componentsJoinedByString:@"' '"], self.archivePath, destination); // Get the file size. - NSNumber *fs = [[NSFileManager defaultManager] attributesOfItemAtPath:self.archivePath error:nil][NSFileSize]; - if (fs == nil) goto reportError; + NSUInteger expectedLength = [[[NSFileManager defaultManager] attributesOfItemAtPath:self.archivePath error:nil][NSFileSize] unsignedIntegerValue]; + if (expectedLength > 0) { + NSFileHandle *archiveInput = [NSFileHandle fileHandleForReadingAtPath:self.archivePath]; - // Thank you, Allan Odgaard! - // (who wrote the following extraction alg.) - fp = fopen([self.archivePath fileSystemRepresentation], "r"); - if (!fp) goto reportError; + NSPipe *pipe = [NSPipe pipe]; + NSFileHandle *archiveOutput = [pipe fileHandleForWriting]; - oldDestinationString = getenv("DESTINATION"); - setenv("DESTINATION", [[self.archivePath stringByDeletingLastPathComponent] fileSystemRepresentation], 1); - cmdFP = popen([command fileSystemRepresentation], "w"); - size_t written; - if (!cmdFP) goto reportError; + NSTask *task = [[NSTask alloc] init]; + [task setStandardInput:[pipe fileHandleForReading]]; + [task setStandardError:[NSFileHandle fileHandleWithStandardError]]; + [task setStandardOutput:[NSFileHandle fileHandleWithStandardOutput]]; + [task setLaunchPath:command]; + [task setArguments:[args arrayByAddingObject:destination]]; + [task launch]; - char buf[32 * 1024]; - size_t len; - while((len = fread(buf, 1, 32*1024, fp))) - { - written = fwrite(buf, 1, len, cmdFP); - if( written < len ) - { - pclose(cmdFP); - goto reportError; + NSUInteger bytesRead = 0; + do { + NSData *data = [archiveInput readDataOfLength:256*1024]; + NSUInteger len = [data length]; + if (!len) { + break; + } + bytesRead += len; + [archiveOutput writeData:data]; + dispatch_async(dispatch_get_main_queue(), ^{ + [self notifyDelegateOfProgress:(double)bytesRead / (double)expectedLength]; + }); } + while(bytesRead < expectedLength); + + [archiveOutput closeFile]; - dispatch_async(dispatch_get_main_queue(), ^{ - [self notifyDelegateOfExtractedLength:len]; - }); - } - pclose(cmdFP); - - if (ferror(fp)) { - goto reportError; + [task waitUntilExit]; + + if ([task terminationStatus] == 0) { + if (bytesRead == expectedLength) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self notifyDelegateOfSuccess]; + }); + return; + } else { + SULog(@"Extraction failed, command '%@' got only %ld of %ld bytes", command, (long)bytesRead, (long)expectedLength); + } + } else { + SULog(@"Extraction failed, command '%@' returned %d", command, [task terminationStatus]); + } + } else { + SULog(@"Extraction failed, archive '%@' is empty", self.archivePath); } - dispatch_async(dispatch_get_main_queue(), delegateSuccess); - goto finally; - - reportError: - dispatch_async(dispatch_get_main_queue(), delegateFailure); - - finally: - if (fp) - fclose(fp); - if (oldDestinationString) - setenv("DESTINATION", oldDestinationString, 1); - else - unsetenv("DESTINATION"); + dispatch_async(dispatch_get_main_queue(), ^{ + [self notifyDelegateOfFailure]; + }); } } @@ -119,28 +118,35 @@ { // *** GETS CALLED ON NON-MAIN THREAD!!! - [self extractArchivePipingDataToCommand:@"tar -xC \"$DESTINATION\""]; + [self extractArchivePipingDataToCommand:@"/usr/bin/tar" args:@[@"-xC"]]; } - (void)extractTGZ { // *** GETS CALLED ON NON-MAIN THREAD!!! - [self extractArchivePipingDataToCommand:@"tar -zxC \"$DESTINATION\""]; + [self extractArchivePipingDataToCommand:@"/usr/bin/tar" args:@[@"-zxC"]]; } - (void)extractTBZ { // *** GETS CALLED ON NON-MAIN THREAD!!! - [self extractArchivePipingDataToCommand:@"tar -jxC \"$DESTINATION\""]; + [self extractArchivePipingDataToCommand:@"/usr/bin/tar" args:@[@"-jxC"]]; } - (void)extractZIP { // *** GETS CALLED ON NON-MAIN THREAD!!! - [self extractArchivePipingDataToCommand:@"ditto -x -k - \"$DESTINATION\""]; + [self extractArchivePipingDataToCommand:@"/usr/bin/ditto" args:@[@"-x",@"-k",@"-"]]; +} + +- (void)extractTXZ +{ + // *** GETS CALLED ON NON-MAIN THREAD!!! + + [self extractArchivePipingDataToCommand:@"/usr/bin/tar" args:@[@"-zxC"]]; } + (void)load diff --git a/Frameworks/Sparkle/Sparkle/SUPlainInstaller.h b/Frameworks/Sparkle/Sparkle/SUPlainInstaller.h index bb7827a67..9fd78f6ff 100644 --- a/Frameworks/Sparkle/Sparkle/SUPlainInstaller.h +++ b/Frameworks/Sparkle/Sparkle/SUPlainInstaller.h @@ -21,7 +21,7 @@ @interface SUPlainInstaller : SUInstaller -+ (void)performInstallationToPath:(NSString *)installationPath fromPath:(NSString *)path host:(SUHost *)host delegate:(id)delegate versionComparator:(id)comparator; ++ (void)performInstallationToPath:(NSString *)installationPath fromPath:(NSString *)path host:(SUHost *)host versionComparator:(id)comparator completionHandler:(void (^)(NSError *))completionHandler; @end diff --git a/Frameworks/Sparkle/Sparkle/SUPlainInstaller.m b/Frameworks/Sparkle/Sparkle/SUPlainInstaller.m index 96973d465..1aeb63171 100644 --- a/Frameworks/Sparkle/Sparkle/SUPlainInstaller.m +++ b/Frameworks/Sparkle/Sparkle/SUPlainInstaller.m @@ -8,20 +8,22 @@ #import "SUPlainInstaller.h" #import "SUPlainInstallerInternals.h" +#import "SUCodeSigningVerifier.h" #import "SUConstants.h" #import "SUHost.h" @implementation SUPlainInstaller -+ (void)performInstallationToPath:(NSString *)installationPath fromPath:(NSString *)path host:(SUHost *)host delegate:(id)delegate versionComparator:(id)comparator ++ (void)performInstallationToPath:(NSString *)installationPath fromPath:(NSString *)path host:(SUHost *)host versionComparator:(id)comparator completionHandler:(void (^)(NSError *))completionHandler { + NSParameterAssert(host); + // Prevent malicious downgrades if (![[[NSBundle bundleWithIdentifier:SUBundleIdentifier] infoDictionary][SUEnableAutomatedDowngradesKey] boolValue]) { - if ([comparator compareVersion:[host version] toVersion:[[NSBundle bundleWithPath:path] objectForInfoDictionaryKey:(__bridge NSString *)kCFBundleVersionKey]] == NSOrderedDescending) - { + if ([comparator compareVersion:[host version] toVersion:[[NSBundle bundleWithPath:path] objectForInfoDictionaryKey:(__bridge NSString *)kCFBundleVersionKey]] == NSOrderedDescending) { NSString *errorMessage = [NSString stringWithFormat:@"Sparkle Updater: Possible attack in progress! Attempting to \"upgrade\" from %@ to %@. Aborting update.", [host version], [[NSBundle bundleWithPath:path] objectForInfoDictionaryKey:(__bridge NSString *)kCFBundleVersionKey]]; NSError *error = [NSError errorWithDomain:SUSparkleErrorDomain code:SUDowngradeError userInfo:@{ NSLocalizedDescriptionKey: errorMessage }]; - [self finishInstallationToPath:installationPath withResult:NO host:host error:error delegate:delegate]; + [self finishInstallationToPath:installationPath withResult:NO error:error completionHandler:completionHandler]; return; } } @@ -30,8 +32,17 @@ NSError *error = nil; NSString *oldPath = [host bundlePath]; NSString *tempName = [self temporaryNameForPath:[host installationPath]]; + BOOL hostIsCodeSigned = [SUCodeSigningVerifier applicationAtPathIsCodeSigned:oldPath]; BOOL result = [self copyPathWithAuthentication:path overPath:installationPath temporaryName:tempName error:&error]; + + if (result) { + // If the host is code signed, then the replacement should be be too (and the signature should be valid). + BOOL needToCheckCodeSignature = (hostIsCodeSigned || [SUCodeSigningVerifier applicationAtPathIsCodeSigned:installationPath]); + if (needToCheckCodeSignature) { + result = [SUCodeSigningVerifier codeSignatureIsValidAtPath:installationPath error:&error]; + } + } if (result) { BOOL haveOld = [[NSFileManager defaultManager] fileExistsAtPath:oldPath]; @@ -42,7 +53,7 @@ } dispatch_async(dispatch_get_main_queue(), ^{ - [self finishInstallationToPath:installationPath withResult:result host:host error:error delegate:delegate]; + [self finishInstallationToPath:installationPath withResult:result error:error completionHandler:completionHandler]; }); }); } diff --git a/Frameworks/Sparkle/Sparkle/SUPlainInstallerInternals.m b/Frameworks/Sparkle/Sparkle/SUPlainInstallerInternals.m index e06e5bdf7..41b297e8b 100644 --- a/Frameworks/Sparkle/Sparkle/SUPlainInstallerInternals.m +++ b/Frameworks/Sparkle/Sparkle/SUPlainInstallerInternals.m @@ -599,7 +599,11 @@ static BOOL AuthorizationExecuteWithPrivilegesAndWait(AuthorizationRef authoriza } #endif NSURL *rootURL = [NSURL fileURLWithPath:root]; - [rootURL setResourceValue:[NSNull null] forKey:NSURLQuarantinePropertiesKey error:NULL]; + id rootResourceValue = nil; + [rootURL getResourceValue:&rootResourceValue forKey:NSURLQuarantinePropertiesKey error:NULL]; + if (rootResourceValue) { + [rootURL setResourceValue:[NSNull null] forKey:NSURLQuarantinePropertiesKey error:NULL]; + } // Only recurse if it's actually a directory. Don't recurse into a // root-level symbolic link. @@ -612,7 +616,11 @@ static BOOL AuthorizationExecuteWithPrivilegesAndWait(AuthorizationRef authoriza NSDirectoryEnumerator *directoryEnumerator = [manager enumeratorAtURL:rootURL includingPropertiesForKeys:nil options:(NSDirectoryEnumerationOptions)0 errorHandler:nil]; for (NSURL *file in directoryEnumerator) { - [file setResourceValue:[NSNull null] forKey:NSURLQuarantinePropertiesKey error:NULL]; + id fileResourceValue = nil; + [file getResourceValue:&fileResourceValue forKey:NSURLQuarantinePropertiesKey error:NULL]; + if (fileResourceValue) { + [file setResourceValue:[NSNull null] forKey:NSURLQuarantinePropertiesKey error:NULL]; + } } } } diff --git a/Frameworks/Sparkle/Sparkle/SUScheduledUpdateDriver.m b/Frameworks/Sparkle/Sparkle/SUScheduledUpdateDriver.m index b51fd91dc..9d6bf141b 100644 --- a/Frameworks/Sparkle/Sparkle/SUScheduledUpdateDriver.m +++ b/Frameworks/Sparkle/Sparkle/SUScheduledUpdateDriver.m @@ -43,10 +43,18 @@ - (void)abortUpdateWithError:(NSError *)error { - if (self.showErrors) + if (self.showErrors) { [super abortUpdateWithError:error]; - else + } else { + // Call delegate separately here because otherwise it won't know we stopped. + // Normally this gets called by the superclass + id updaterDelegate = [self.updater delegate]; + if ([updaterDelegate respondsToSelector:@selector(updater:didAbortWithError:)]) { + [updaterDelegate updater:self.updater didAbortWithError:error]; + } + [self abortUpdate]; + } } @end diff --git a/Frameworks/Sparkle/Sparkle/SUStatusController.m b/Frameworks/Sparkle/Sparkle/SUStatusController.m index b1ca3b039..c7def5d5d 100644 --- a/Frameworks/Sparkle/Sparkle/SUStatusController.m +++ b/Frameworks/Sparkle/Sparkle/SUStatusController.m @@ -31,7 +31,7 @@ - (instancetype)initWithHost:(SUHost *)aHost { - self = [super initWithHost:aHost windowNibName:@"SUStatus"]; + self = [super initWithWindowNibName:@"SUStatus"]; if (self) { self.host = aHost; diff --git a/Frameworks/Sparkle/Sparkle/SUUIBasedUpdateDriver.h b/Frameworks/Sparkle/Sparkle/SUUIBasedUpdateDriver.h index fb1450724..65f374433 100644 --- a/Frameworks/Sparkle/Sparkle/SUUIBasedUpdateDriver.h +++ b/Frameworks/Sparkle/Sparkle/SUUIBasedUpdateDriver.h @@ -15,7 +15,7 @@ @class SUStatusController; -@interface SUUIBasedUpdateDriver : SUBasicUpdateDriver +@interface SUUIBasedUpdateDriver : SUBasicUpdateDriver - (void)showModalAlert:(NSAlert *)alert; - (IBAction)cancelDownload:(id)sender; diff --git a/Frameworks/Sparkle/Sparkle/SUUIBasedUpdateDriver.m b/Frameworks/Sparkle/Sparkle/SUUIBasedUpdateDriver.m index ef631466f..7875dadd9 100644 --- a/Frameworks/Sparkle/Sparkle/SUUIBasedUpdateDriver.m +++ b/Frameworks/Sparkle/Sparkle/SUUIBasedUpdateDriver.m @@ -28,8 +28,9 @@ - (void)didFindValidUpdate { - self.updateAlert = [[SUUpdateAlert alloc] initWithAppcastItem:self.updateItem host:self.host]; - [self.updateAlert setDelegate:self]; + self.updateAlert = [[SUUpdateAlert alloc] initWithAppcastItem:self.updateItem host:self.host completionBlock:^(SUUpdateAlertChoice choice) { + [self updateAlertFinishedWithChoice:choice]; + }]; id versDisp = nil; if ([[self.updater delegate] respondsToSelector:@selector(versionDisplayerForUpdater:)]) { @@ -44,8 +45,7 @@ // If the app is a menubar app or the like, we need to focus it first and alter the // update prompt to behave like a normal window. Otherwise if the window were hidden // there may be no way for the application to be activated to make it visible again. - if ([self.host isBackgroundApplication]) - { + if ([self.host isBackgroundApplication]) { [[self.updateAlert window] setHidesOnDeactivate:NO]; [NSApp activateIgnoringOtherApps:YES]; } @@ -78,12 +78,11 @@ [[NSNotificationCenter defaultCenter] removeObserver:self name:NSApplicationDidBecomeActiveNotification object:NSApp]; } -- (void)updateAlert:(SUUpdateAlert *)__unused alert finishedWithChoice:(SUUpdateAlertChoice)choice +- (void)updateAlertFinishedWithChoice:(SUUpdateAlertChoice)choice { self.updateAlert = nil; [self.host setObject:nil forUserDefaultsKey:SUSkippedVersionKey]; - switch (choice) - { + switch (choice) { case SUInstallUpdateChoice: self.statusController = [[SUStatusController alloc] initWithHost:self.host]; [self.statusController beginActionWithTitle:SULocalizedString(@"Downloading update...", @"Take care not to overflow the status window.") maxProgressValue:0.0 statusText:nil]; @@ -154,16 +153,13 @@ [super extractUpdate]; } -- (void)unarchiver:(SUUnarchiver *)__unused ua extractedLength:(unsigned long)length +- (void)unarchiver:(SUUnarchiver *)__unused ua extractedProgress:(double)progress { // We do this here instead of in extractUpdate so that we only have a determinate progress bar for archives with progress. - if ([self.statusController maxProgressValue] == 0.0) - { - NSDictionary *attributes; - attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:self.downloadPath error:nil]; - [self.statusController setMaxProgressValue:[attributes[NSFileSize] doubleValue]]; + if ([self.statusController maxProgressValue] == 0.0) { + [self.statusController setMaxProgressValue:1]; } - [self.statusController setProgressValue:[self.statusController progressValue] + (double)length]; + [self.statusController setProgressValue:progress]; } - (void)unarchiverDidFinish:(SUUnarchiver *)__unused ua diff --git a/Frameworks/Sparkle/Sparkle/SUUnarchiver.h b/Frameworks/Sparkle/Sparkle/SUUnarchiver.h index 523bdf257..9b7d07807 100644 --- a/Frameworks/Sparkle/Sparkle/SUUnarchiver.h +++ b/Frameworks/Sparkle/Sparkle/SUUnarchiver.h @@ -15,10 +15,10 @@ @interface SUUnarchiver : NSObject @property (copy, readonly) NSString *archivePath; -@property (weak, readonly) SUHost *updateHost; +@property (copy, readonly) NSString *updateHostBundlePath; @property (weak) id delegate; -+ (SUUnarchiver *)unarchiverForPath:(NSString *)path updatingHost:(SUHost *)host; ++ (SUUnarchiver *)unarchiverForPath:(NSString *)path updatingHostBundlePath:(NSString *)host; - (void)start; @end @@ -27,7 +27,7 @@ - (void)unarchiverDidFinish:(SUUnarchiver *)unarchiver; - (void)unarchiverDidFail:(SUUnarchiver *)unarchiver; @optional -- (void)unarchiver:(SUUnarchiver *)unarchiver extractedLength:(unsigned long)length; +- (void)unarchiver:(SUUnarchiver *)unarchiver extractedProgress:(double)progress; @end #endif diff --git a/Frameworks/Sparkle/Sparkle/SUUnarchiver.m b/Frameworks/Sparkle/Sparkle/SUUnarchiver.m index 99f777592..fefa840bf 100644 --- a/Frameworks/Sparkle/Sparkle/SUUnarchiver.m +++ b/Frameworks/Sparkle/Sparkle/SUUnarchiver.m @@ -18,15 +18,15 @@ @implementation SUUnarchiver @synthesize archivePath; -@synthesize updateHost; +@synthesize updateHostBundlePath; @synthesize delegate; -+ (SUUnarchiver *)unarchiverForPath:(NSString *)path updatingHost:(SUHost *)host ++ (SUUnarchiver *)unarchiverForPath:(NSString *)path updatingHostBundlePath:(NSString *)hostPath { for (id current in [self unarchiverImplementations]) { if ([current canUnarchivePath:path]) { - return [[current alloc] initWithPath:path host:host]; + return [[current alloc] initWithPath:path hostBundlePath:hostPath]; } } return nil; @@ -39,12 +39,12 @@ // No-op } -- (instancetype)initWithPath:(NSString *)path host:(SUHost *)host +- (instancetype)initWithPath:(NSString *)path hostBundlePath:(NSString *)hostPath { if ((self = [super init])) { archivePath = [path copy]; - updateHost = host; + updateHostBundlePath = hostPath; } return self; } @@ -54,10 +54,10 @@ return NO; } -- (void)notifyDelegateOfExtractedLength:(size_t)length +- (void)notifyDelegateOfProgress:(double)progress { - if ([self.delegate respondsToSelector:@selector(unarchiver:extractedLength:)]) { - [self.delegate unarchiver:self extractedLength:length]; + if ([self.delegate respondsToSelector:@selector(unarchiver:extractedProgress:)]) { + [self.delegate unarchiver:self extractedProgress:progress]; } } diff --git a/Frameworks/Sparkle/Sparkle/SUUnarchiver_Private.h b/Frameworks/Sparkle/Sparkle/SUUnarchiver_Private.h index e2d66bd08..c29d68cff 100644 --- a/Frameworks/Sparkle/Sparkle/SUUnarchiver_Private.h +++ b/Frameworks/Sparkle/Sparkle/SUUnarchiver_Private.h @@ -16,9 +16,9 @@ + (void)registerImplementation:(Class)implementation; + (NSArray *)unarchiverImplementations; + (BOOL)canUnarchivePath:(NSString *)path; -- (instancetype)initWithPath:(NSString *)path host:(SUHost *)host; +- (instancetype)initWithPath:(NSString *)archive hostBundlePath:(NSString *)host; -- (void)notifyDelegateOfExtractedLength:(size_t)length; +- (void)notifyDelegateOfProgress:(double)progress; - (void)notifyDelegateOfSuccess; - (void)notifyDelegateOfFailure; @end diff --git a/Frameworks/Sparkle/Sparkle/SUUpdateAlert.h b/Frameworks/Sparkle/Sparkle/SUUpdateAlert.h index caf9ccba9..2db57bf49 100644 --- a/Frameworks/Sparkle/Sparkle/SUUpdateAlert.h +++ b/Frameworks/Sparkle/Sparkle/SUUpdateAlert.h @@ -24,10 +24,9 @@ typedef NS_ENUM(NSInteger, SUUpdateAlertChoice) { @class WebView, SUAppcastItem, SUHost; @interface SUUpdateAlert : SUWindowController -@property (weak) id delegate; @property (weak) id versionDisplayer; -- (instancetype)initWithAppcastItem:(SUAppcastItem *)item host:(SUHost *)host; +- (instancetype)initWithAppcastItem:(SUAppcastItem *)item host:(SUHost *)host completionBlock:(void(^)(SUUpdateAlertChoice))c; - (IBAction)installUpdate:sender; - (IBAction)skipThisVersion:sender; @@ -35,10 +34,4 @@ typedef NS_ENUM(NSInteger, SUUpdateAlertChoice) { @end -@protocol SUUpdateAlertDelegate -- (void)updateAlert:(SUUpdateAlert *)updateAlert finishedWithChoice:(SUUpdateAlertChoice)updateChoice; -@optional -- (void)updateAlert:(SUUpdateAlert *)updateAlert shouldAllowAutoUpdate:(BOOL *)shouldAllowAutoUpdate; -@end - #endif diff --git a/Frameworks/Sparkle/Sparkle/SUUpdateAlert.m b/Frameworks/Sparkle/Sparkle/SUUpdateAlert.m index 2ca4093be..0b3610381 100644 --- a/Frameworks/Sparkle/Sparkle/SUUpdateAlert.m +++ b/Frameworks/Sparkle/Sparkle/SUUpdateAlert.m @@ -21,6 +21,7 @@ @property (strong) SUAppcastItem *updateItem; @property (strong) SUHost *host; +@property (strong) void(^completionBlock)(SUUpdateAlertChoice); @property (strong) NSProgressIndicator *releaseNotesSpinner; @property (assign) BOOL webViewFinishedLoading; @@ -36,7 +37,7 @@ @implementation SUUpdateAlert -@synthesize delegate; +@synthesize completionBlock; @synthesize versionDisplayer; @synthesize updateItem; @@ -52,11 +53,12 @@ @synthesize skipButton; @synthesize laterButton; -- (instancetype)initWithAppcastItem:(SUAppcastItem *)item host:(SUHost *)aHost +- (instancetype)initWithAppcastItem:(SUAppcastItem *)item host:(SUHost *)aHost completionBlock:(void (^)(SUUpdateAlertChoice))block { - self = [super initWithHost:host windowNibName:@"SUUpdateAlert"]; + self = [super initWithWindowNibName:@"SUUpdateAlert"]; if (self) { + self.completionBlock = block; host = aHost; updateItem = item; [self setShouldCascadeWindows:NO]; @@ -79,8 +81,8 @@ [self.releaseNotesView setPolicyDelegate:nil]; [self.releaseNotesView removeFromSuperview]; // Otherwise it gets sent Esc presses (why?!) and gets very confused. [self close]; - if ([self.delegate respondsToSelector:@selector(updateAlert:finishedWithChoice:)]) - [self.delegate updateAlert:self finishedWithChoice:choice]; + self.completionBlock(choice); + self.completionBlock = nil; } - (IBAction)installUpdate:(id)__unused sender @@ -164,10 +166,6 @@ if ([self.host objectForInfoDictionaryKey:SUAllowsAutomaticUpdatesKey]) allowAutoUpdates = [self.host boolForInfoDictionaryKey:SUAllowsAutomaticUpdatesKey]; - // Give delegate a chance to modify this choice: - if (self.delegate && [self.delegate respondsToSelector:@selector(updateAlert:shouldAllowAutoUpdate:)]) - [self.delegate updateAlert:self shouldAllowAutoUpdate:&allowAutoUpdates]; - return allowAutoUpdates; } diff --git a/Frameworks/Sparkle/Sparkle/SUUpdatePermissionPrompt.m b/Frameworks/Sparkle/Sparkle/SUUpdatePermissionPrompt.m index 6d31cdf69..6aef7bd2d 100644 --- a/Frameworks/Sparkle/Sparkle/SUUpdatePermissionPrompt.m +++ b/Frameworks/Sparkle/Sparkle/SUUpdatePermissionPrompt.m @@ -45,7 +45,7 @@ - (instancetype)initWithHost:(SUHost *)aHost systemProfile:(NSArray *)profile delegate:(id)d { - self = [super initWithHost:aHost windowNibName:@"SUUpdatePermissionPrompt"]; + self = [super initWithWindowNibName:@"SUUpdatePermissionPrompt"]; if (self) { host = aHost; @@ -65,8 +65,11 @@ // the user would not know why the application was paused. if ([aHost isBackgroundApplication]) { [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; } - SUUpdatePermissionPrompt *prompt = [[[self class] alloc] initWithHost:aHost systemProfile:profile delegate:d]; - [NSApp runModalForWindow:[prompt window]]; + if( ![NSApp modalWindow]) // do not prompt if there is is another modal window on screen + { + SUUpdatePermissionPrompt *prompt = [[[self class] alloc] initWithHost:aHost systemProfile:profile delegate:d]; + [NSApp runModalForWindow:[prompt window]]; + } } - (NSString *)description { return [NSString stringWithFormat:@"%@ <%@>", [self class], [self.host bundlePath]]; } diff --git a/Frameworks/Sparkle/Sparkle/SUUpdater.h b/Frameworks/Sparkle/Sparkle/SUUpdater.h index f83fed5bf..90d606fa4 100644 --- a/Frameworks/Sparkle/Sparkle/SUUpdater.h +++ b/Frameworks/Sparkle/Sparkle/SUUpdater.h @@ -25,7 +25,7 @@ */ SU_EXPORT @interface SUUpdater : NSObject -@property (weak) IBOutlet id delegate; +@property (unsafe_unretained) IBOutlet id delegate; + (SUUpdater *)sharedUpdater; + (SUUpdater *)updaterForBundle:(NSBundle *)bundle; @@ -46,6 +46,8 @@ SU_EXPORT @interface SUUpdater : NSObject @property (nonatomic, copy) NSString *userAgentString; +@property (copy) NSDictionary *httpHeaders; + @property BOOL sendsSystemProfile; @property BOOL automaticallyDownloadsUpdates; @@ -312,6 +314,14 @@ SU_EXPORT extern NSString *const SUUpdaterAppcastNotificationKey; */ - (void)updater:(SUUpdater *)updater didCancelInstallUpdateOnQuit:(SUAppcastItem *)item; +/*! + Called after an update is aborted due to an error. + + \param updater The SUUpdater instance. + \param error The error that caused the abort + */ +- (void)updater:(SUUpdater *)updater didAbortWithError:(NSError *)error; + @end #endif diff --git a/Frameworks/Sparkle/Sparkle/SUUpdater.m b/Frameworks/Sparkle/Sparkle/SUUpdater.m index 7d0e25d52..ee26656ce 100644 --- a/Frameworks/Sparkle/Sparkle/SUUpdater.m +++ b/Frameworks/Sparkle/Sparkle/SUUpdater.m @@ -51,12 +51,10 @@ NSString *const SUUpdaterAppcastNotificationKey = @"SUUpdaterAppCastNotification @synthesize delegate; @synthesize checkTimer; @synthesize userAgentString = customUserAgentString; - +@synthesize httpHeaders; @synthesize driver; @synthesize host; -#pragma mark Initialization - static NSMutableDictionary *sharedUpdaters = nil; static NSString *const SUUpdaterDefaultsObservationContext = @"SUUpdaterDefaultsObservationContext"; @@ -147,38 +145,28 @@ static NSString *const SUUpdaterDefaultsObservationContext = @"SUUpdaterDefaults - (void)startUpdateCycle { BOOL shouldPrompt = NO; + BOOL hasLaunchedBefore = [self.host boolForUserDefaultsKey:SUHasLaunchedBeforeKey]; // If the user has been asked about automatic checks, don't bother prompting - if ([self.host objectForUserDefaultsKey:SUEnableAutomaticChecksKey]) - { + if ([self.host objectForUserDefaultsKey:SUEnableAutomaticChecksKey]) { shouldPrompt = NO; } // Does the delegate want to take care of the logic for when we should ask permission to update? - else if ([self.delegate respondsToSelector:@selector(updaterShouldPromptForPermissionToCheckForUpdates:)]) - { + else if ([self.delegate respondsToSelector:@selector(updaterShouldPromptForPermissionToCheckForUpdates:)]) { shouldPrompt = [self.delegate updaterShouldPromptForPermissionToCheckForUpdates:self]; } // Has he been asked already? And don't ask if the host has a default value set in its Info.plist. - else if ([self.host objectForKey:SUEnableAutomaticChecksKey] == nil) - { - if ([self.host objectForUserDefaultsKey:SUEnableAutomaticChecksKeyOld]) { - [self setAutomaticallyChecksForUpdates:[self.host boolForUserDefaultsKey:SUEnableAutomaticChecksKeyOld]]; - } + else if ([self.host objectForKey:SUEnableAutomaticChecksKey] == nil) { // Now, we don't want to ask the user for permission to do a weird thing on the first launch. // We wait until the second launch, unless explicitly overridden via SUPromptUserOnFirstLaunchKey. - else if (![self.host objectForKey:SUPromptUserOnFirstLaunchKey]) - { - if ([self.host boolForUserDefaultsKey:SUHasLaunchedBeforeKey] == NO) - [self.host setBool:YES forUserDefaultsKey:SUHasLaunchedBeforeKey]; - else - shouldPrompt = YES; - } - else - shouldPrompt = YES; + shouldPrompt = [self.host objectForKey:SUPromptUserOnFirstLaunchKey] || hasLaunchedBefore; } - if (shouldPrompt) - { + if (!hasLaunchedBefore) { + [self.host setBool:YES forUserDefaultsKey:SUHasLaunchedBeforeKey]; + } + + if (shouldPrompt) { NSArray *profileInfo = [self.host systemProfile]; // Always say we're sending the system profile here so that the delegate displays the parameters it would send. if ([self.delegate respondsToSelector:@selector(feedParametersForUpdater:sendingSystemProfile:)]) { @@ -186,9 +174,7 @@ static NSString *const SUUpdaterDefaultsObservationContext = @"SUUpdaterDefaults } [SUUpdatePermissionPrompt promptWithHost:self.host systemProfile:profileInfo delegate:self]; // We start the update checks and register as observer for changes after the prompt finishes - } - else - { + } else { // We check if the user's said they want updates, or they haven't said anything, and the default is set to checking. [self scheduleNextUpdateCheck]; } @@ -334,9 +320,6 @@ static NSString *const SUUpdaterDefaultsObservationContext = @"SUUpdaterDefaults if ([self updateInProgress]) { return; } if (self.checkTimer) { [self.checkTimer invalidate]; self.checkTimer = nil; } // Timer is non-repeating, may have invalidated itself, so we had to retain it. - SUClearLog(); - SULog(@"===== %@ =====", [[NSFileManager defaultManager] displayNameAtPath:[[NSBundle mainBundle] bundlePath]]); - [self willChangeValueForKey:@"lastUpdateCheckDate"]; [self.host setObject:[NSDate date] forUserDefaultsKey:SULastCheckTimeKey]; [self didChangeValueForKey:@"lastUpdateCheckDate"]; diff --git a/Frameworks/Sparkle/Sparkle/SUUserInitiatedUpdateDriver.m b/Frameworks/Sparkle/Sparkle/SUUserInitiatedUpdateDriver.m index 5dd66f298..d1e0c9a65 100644 --- a/Frameworks/Sparkle/Sparkle/SUUserInitiatedUpdateDriver.m +++ b/Frameworks/Sparkle/Sparkle/SUUserInitiatedUpdateDriver.m @@ -78,16 +78,6 @@ [super abortUpdate]; } -- (void)appcast:(SUAppcast *)ac failedToLoadWithError:(NSError *)error -{ - if (self.isCanceled) - { - [self abortUpdate]; - return; - } - [super appcast:ac failedToLoadWithError:error]; -} - - (BOOL)itemContainsValidUpdate:(SUAppcastItem *)ui { // We don't check to see if this update's been skipped, because the user explicitly *asked* if he had the latest version. diff --git a/Frameworks/Sparkle/Sparkle/SUWindowController.h b/Frameworks/Sparkle/Sparkle/SUWindowController.h index 0cd60191b..f6af6fae3 100644 --- a/Frameworks/Sparkle/Sparkle/SUWindowController.h +++ b/Frameworks/Sparkle/Sparkle/SUWindowController.h @@ -14,7 +14,7 @@ @class SUHost; @interface SUWindowController : NSWindowController // We use this instead of plain old NSWindowController initWithWindowNibName so that we'll be able to find the right path when running in a bundle loaded from another app. -- (instancetype)initWithHost:(SUHost *)host windowNibName:(NSString *)nibName; +- (instancetype)initWithWindowNibName:(NSString *)nibName; @end #endif diff --git a/Frameworks/Sparkle/Sparkle/SUWindowController.m b/Frameworks/Sparkle/Sparkle/SUWindowController.m index 874f76535..553231130 100644 --- a/Frameworks/Sparkle/Sparkle/SUWindowController.m +++ b/Frameworks/Sparkle/Sparkle/SUWindowController.m @@ -11,16 +11,9 @@ @implementation SUWindowController -- (instancetype)initWithHost:(SUHost *)host windowNibName:(NSString *)nibName +- (instancetype)initWithWindowNibName:(NSString *)nibName { - NSString *path = [[NSBundle bundleForClass:[self class]] pathForResource:nibName ofType:@"nib"]; - if (path == nil) // Slight hack to resolve issues with running Sparkle in debug configurations. - { - NSString *frameworkPath = [[[host bundle] sharedFrameworksPath] stringByAppendingPathComponent:@"Sparkle.framework"]; - NSBundle *framework = [NSBundle bundleWithPath:frameworkPath]; - path = [framework pathForResource:nibName ofType:@"nib"]; - } - self = [super initWithWindowNibPath:path owner:self]; + self = [super initWithWindowNibName:nibName owner:self]; return self; } diff --git a/Frameworks/Sparkle/Sparkle/Sparkle.h b/Frameworks/Sparkle/Sparkle/Sparkle.h index 555cb6f64..fe97bae17 100644 --- a/Frameworks/Sparkle/Sparkle/Sparkle.h +++ b/Frameworks/Sparkle/Sparkle/Sparkle.h @@ -18,5 +18,6 @@ #import #import #import +#import #endif diff --git a/Frameworks/Sparkle/Sparkle/Sparkle.pch b/Frameworks/Sparkle/Sparkle/Sparkle.pch index e30bf990c..ccd8c7591 100644 --- a/Frameworks/Sparkle/Sparkle/Sparkle.pch +++ b/Frameworks/Sparkle/Sparkle/Sparkle.pch @@ -10,6 +10,7 @@ #import #import "SUConstants.h" +#import "SUErrors.h" #define SULocalizedString(key, comment) NSLocalizedStringFromTableInBundle(key, @"Sparkle", [NSBundle bundleWithIdentifier:SUBundleIdentifier] ? [NSBundle bundleWithIdentifier:SUBundleIdentifier] : [NSBundle mainBundle], comment) diff --git a/Frameworks/Sparkle/Sparkle/en.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/en.lproj/SUUpdatePermissionPrompt.xib index 149753b1e..c110598fb 100644 --- a/Frameworks/Sparkle/Sparkle/en.lproj/SUUpdatePermissionPrompt.xib +++ b/Frameworks/Sparkle/Sparkle/en.lproj/SUUpdatePermissionPrompt.xib @@ -44,7 +44,7 @@ DQ -