Browse Source

SpruceSSL Start

master
GRMrGecko 14 years ago
commit
59c03b51fc
  1. 12
      .gitignore
  2. 16
      About.rtf
  3. 363
      Classes/MGMSpruceSSL copy.m
  4. 52
      Classes/MGMSpruceSSL.h
  5. 385
      Classes/MGMSpruceSSL.m
  6. 15
      Classes/MGMSpruceURL.h
  7. 39
      Classes/MGMSpruceURL.m
  8. 16
      Classes/MGMWebViewMethods.h
  9. 25
      Classes/MGMWebViewMethods.m
  10. 9
      Classes/Safari.h
  11. 7
      Classes/SpruceSSL_Prefix.pch
  12. 1
      Frameworks/Sparkle.framework/Headers
  13. 1
      Frameworks/Sparkle.framework/Resources
  14. 1
      Frameworks/Sparkle.framework/Sparkle
  15. 36
      Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcast.h
  16. 54
      Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h
  17. 126
      Frameworks/Sparkle.framework/Versions/A/Headers/SUUpdater.h
  18. 27
      Frameworks/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h
  19. 21
      Frameworks/Sparkle.framework/Versions/A/Headers/Sparkle.h
  20. 24
      Frameworks/Sparkle.framework/Versions/A/Resources/Info.plist
  21. 153
      Frameworks/Sparkle.framework/Versions/A/Resources/License.txt
  22. 174
      Frameworks/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist
  23. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib
  24. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib
  25. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib
  26. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib
  27. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings
  28. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib
  29. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib
  30. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib
  31. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings
  32. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib
  33. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib
  34. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib
  35. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings
  36. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib
  37. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib
  38. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib
  39. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings
  40. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib
  41. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib
  42. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib
  43. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings
  44. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib
  45. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib
  46. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib
  47. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings
  48. 1
      Frameworks/Sparkle.framework/Versions/A/Resources/fr_CA.lproj
  49. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib
  50. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib
  51. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib
  52. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings
  53. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib
  54. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib
  55. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib
  56. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings
  57. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib
  58. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib
  59. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdatePermissionPrompt.nib
  60. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings
  61. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib
  62. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib
  63. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib
  64. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings
  65. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/SUAutomaticUpdateAlert.nib
  66. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdateAlert.nib
  67. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.nib
  68. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/Sparkle.strings
  69. 1
      Frameworks/Sparkle.framework/Versions/A/Resources/pt.lproj
  70. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUAutomaticUpdateAlert.nib
  71. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdateAlert.nib
  72. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.nib
  73. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings
  74. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUAutomaticUpdateAlert.nib
  75. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.nib
  76. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdatePermissionPrompt.nib
  77. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/Sparkle.strings
  78. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/relaunch
  79. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib
  80. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib
  81. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib
  82. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings
  83. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib
  84. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib
  85. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib
  86. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings
  87. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.nib
  88. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.nib
  89. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.nib
  90. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/Sparkle.strings
  91. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUAutomaticUpdateAlert.nib
  92. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.nib
  93. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.nib
  94. BIN
      Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings
  95. BIN
      Frameworks/Sparkle.framework/Versions/A/Sparkle
  96. 1
      Frameworks/Sparkle.framework/Versions/Current
  97. 20
      License.txt
  98. 46
      Readme.rtf
  99. 2
      Resources/English.lproj/InfoPlist.strings
  100. 80
      Resources/Info.plist

12
.gitignore

@ -0,0 +1,12 @@
build
*.zip
*.xcodeproj/*.pbxuser
*.xcodeproj/*.mode*
*.xcodeproj/*.perspective*
*.xcodeproj/xcuserdata
*.xcodeproj/project.xcworkspace/xcuserdata
*.xcworkspace/xcuserdata
SIP/opt*
SIP/pjproject*
SpruceSSL/*.pkg
Screenshots/*

16
About.rtf

@ -0,0 +1,16 @@
{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\margl1440\margr1440\vieww9000\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\qc\pardirnatural
\f0\fs32 \cf0 Special Thanks To\
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\qc\pardirnatural
\fs24 \cf0 Shadedjon\
MegaEduX ({\field{\*\fldinst{HYPERLINK "http://megaedux.com"}}{\fldrslt megaedux.com}})\
RockStar ({\field{\*\fldinst{HYPERLINK "http://rocknthesweater.com"}}{\fldrslt rocknthesweater.com}})\
PowerOfCheese ({\field{\*\fldinst{HYPERLINK "http://xtrememachinez.com"}}{\fldrslt xtrememachinez.com}})\
\
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\cf0 SpruceSSL is a open source plugin for many webkit based browsers that allows users to force websites to go through the SSL protocol (HTTPS) using a blacklist and a whitelist to protect you against the possibility of your accounts/information getting stolen. With the ability to also force cookies to be secure only (Meaning you can not access it out side of https), you can be sure your accounts/information will not get leaked with the whitelisted sites. Using SpruceSSL can help you protect against sslstrip and FireSheep.}

363
Classes/MGMSpruceSSL copy.m

@ -0,0 +1,363 @@
//
// MGMSpruceSSL.m
// SpruceSSL
//
// Created by Mr. Gecko on 10/31/10.
// Copyright 2010 Mr. Gecko's Media. All rights reserved.
//
#import "MGMSpruceSSL.h"
#import "Safari.h"
#import <objc/objc.h>
#import <objc/objc-class.h>
#import <objc/objc-runtime.h>
#import <Sparkle/Sparkle.h>
@protocol MGMFileManagerProtocol <NSObject>
- (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary *)attributes error:(NSError **)error;
- (BOOL)createDirectoryAtPath:(NSString *)path attributes:(NSDictionary *)attributes;
- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;
- (BOOL)removeFileAtPath:(NSString *)path handler:(id)handler;
- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
- (BOOL)copyPath:(NSString *)source toPath:(NSString *)destination handler:(id)handler;
- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
- (BOOL)movePath:(NSString *)source toPath:(NSString *)destination handler:(id)handler;
@end
NSString * const MGMChangeCookies = @"MGMChangeCookies";
NSString * const MGMApplicationSupportPath = @"~/Library/Application Support/MrGeckosMedia/SpruceSSL/";
NSString * const MGMHostWhitelist = @"hostWhitelist.plist";
NSString * const MGMHostBlacklist = @"hostBlacklist.plist";
static MGMSpruceSSL *MGMSpruceSSLShared;
static IMP MGMResourceWillLoadOriginal;
static IMP MGMLoadFinishedOriginal;
id MGMResourceWillLoadOverride(id self, SEL _cmd, WebView *sender, id identifier, NSURLRequest *request, NSURLResponse *redirectResponse, WebDataSource *dataSource) {
MGMSpruceSSL *spruceSSL = [MGMSpruceSSL sharedInstance];
if ([[request URL] host]!=nil && ![[[[[sender mainFrame] dataSource] request] URL] isEqualTo:[request URL]] && [[[request URL] scheme] isEqual:@"http"] && [spruceSSL isSSLForHost:[[request URL] host]]) {
NSMutableURLRequest *sslRequest = [[request mutableCopy] autorelease];
NSMutableString *url = [[[[request URL] absoluteString] mutableCopy] autorelease];
[url insertString:@"s" atIndex:4];
[sslRequest setURL:[NSURL URLWithString:url]];
return MGMResourceWillLoadOriginal(self, _cmd, sender, identifier, sslRequest, redirectResponse, dataSource);
}
return MGMResourceWillLoadOriginal(self, _cmd, sender, identifier, request, redirectResponse, dataSource);
}
void MGMLoadFinishedOverride(id self, SEL _cmd, WebView *sender) {
MGMSpruceSSL *spruceSSL = [MGMSpruceSSL sharedInstance];
NSURL *url = [NSURL URLWithString:[sender mainFrameURL]];
if ([url host]!=nil && [[url scheme] isEqual:@"https"] && (([[NSUserDefaults standardUserDefaults] integerForKey:MGMChangeCookies]==1 && [spruceSSL isSSLForHost:[url host]]) || ([[NSUserDefaults standardUserDefaults] integerForKey:MGMChangeCookies]==2 && ![spruceSSL isHostBlackListed:[url host]]))) {
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *cookies = [storage cookiesForURL:url];
for (unsigned int i=0; i<[cookies count]; i++) {
if (![[cookies objectAtIndex:i] isSecure]) {
NSMutableDictionary *cookie = [[[cookies objectAtIndex:i] properties] mutableCopy];
[cookie setObject:[NSNumber numberWithBool:YES] forKey:NSHTTPCookieSecure];
[storage setCookie:[NSHTTPCookie cookieWithProperties:cookie]];
[cookie release];
}
}
}
MGMLoadFinishedOriginal(self, _cmd, sender);
}
IMP MGMReplaceImplementation(Class class, SEL selector, IMP implementation) {
Method method = class_getInstanceMethod(class, selector);
//if (method_setImplementation!=NULL)
NSLog(@"Replacing Method");
return method_setImplementation(method, implementation);
IMP originalImplementation = method_getImplementation(method);
class_addMethod(class, selector, implementation, NULL);
return originalImplementation;
}
void MGMSwizzle(Class class1, SEL selector1, Class class2, SEL selector2) {
NSLog(@"Test Swizzle");
Method method1 = class_getInstanceMethod(class1, selector1);
Method method2 = class_getInstanceMethod(class2, selector2);
IMP implementation1 = method_getImplementation(method1);
IMP implementation2 = method_getImplementation(method2);
method_setImplementation(method1, implementation2);
method_setImplementation(method2, implementation1);
/*#if OBJC_API_VERSION >= 2
NSLog(@"Swizzling");
Method method1 = class_getInstanceMethod(class1, selector1);
if (method1==NULL)
return;
Method method2 = class_getInstanceMethod(class2, selector2);
if (method2==NULL)
return;
class_addMethod(class2, selector1, class_getMethodImplementation(class1, selector1), method_getTypeEncoding(method1));
class_addMethod(class1, selector2, class_getMethodImplementation(class2, selector2), method_getTypeEncoding(method2));
method_exchangeImplementations(class_getInstanceMethod(class2, selector1), class_getInstanceMethod(class1, selector2));
#else
NSLog(@"Swizzling Old");
Method method1 = NULL, method2 = NULL;
void *iterator = NULL;
struct objc_method_list *list = class_nextMethodList(class1, &iterator);
while (list!=NULL) {
for (int i=0; i<list->method_count; i++) {
if (list->method_list[i].method_name==selector1) {
method1 = &list->method_list[i];
break;
}
}
if (method1!=NULL)
break;
list = class_nextMethodList(class1, &iterator);
}
if (method1==NULL)
return;
list = class_nextMethodList(class2, &iterator);
while (list!=NULL) {
for (int i=0; i<list->method_count; i++) {
if (list->method_list[i].method_name==selector2) {
method2 = &list->method_list[i];
break;
}
}
if (method2!=NULL)
break;
list = class_nextMethodList(class2, &iterator);
}
if (method2==NULL)
return;
IMP implementation1 = method1->method_imp;
IMP implementation2 = method2->method_imp;
method1->method_imp = implementation2;
method2->method_imp = implementation1;
#endif*/
}
@implementation MGMSpruceSSL
+ (void)load {
[[self sharedInstance] load];
}
+ (MGMSpruceSSL *)sharedInstance {
if (MGMSpruceSSLShared==nil)
MGMSpruceSSLShared = [[self alloc] init];
return MGMSpruceSSLShared;
}
- (id)init {
if (self = [super init]) {
updater = [[SUUpdater alloc] initForBundle:[NSBundle bundleForClass:[MGMSpruceSSL class]]];
NSFileManager<MGMFileManagerProtocol> *manager = [NSFileManager defaultManager];
if (![manager fileExistsAtPath:[MGMApplicationSupportPath stringByExpandingTildeInPath]]) {
if ([manager respondsToSelector:@selector(createDirectoryAtPath:attributes:)]) {
[manager createDirectoryAtPath:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByDeletingLastPathComponent] attributes:nil];
[manager createDirectoryAtPath:[MGMApplicationSupportPath stringByExpandingTildeInPath] attributes:nil];
} else {
[manager createDirectoryAtPath:[MGMApplicationSupportPath stringByExpandingTildeInPath] withIntermediateDirectories:YES attributes:nil error:nil];
}
}
if (![manager fileExistsAtPath:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostWhitelist]]) {
whitelist = [[NSMutableArray arrayWithContentsOfFile:[[[NSBundle bundleForClass:[MGMSpruceSSL class]] resourcePath] stringByAppendingPathComponent:MGMHostWhitelist]] retain];
[whitelist writeToFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostWhitelist] atomically:NO];
} else {
whitelist = [[NSMutableArray arrayWithContentsOfFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostWhitelist]] retain];
}
if (![manager fileExistsAtPath:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostBlacklist]]) {
blacklist = [[NSMutableArray arrayWithContentsOfFile:[[[NSBundle bundleForClass:[MGMSpruceSSL class]] resourcePath] stringByAppendingPathComponent:MGMHostBlacklist]] retain];
[blacklist writeToFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostBlacklist] atomically:NO];
} else {
blacklist = [[NSMutableArray arrayWithContentsOfFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostBlacklist]] retain];
}
NSNotificationCenter *notifications = [NSNotificationCenter defaultCenter];
[notifications addObserver:self selector:@selector(willTerminate) name:NSApplicationWillTerminateNotification object:nil];
}
return self;
}
- (void)load {
NSLog(@"Hello from SpruceSSL");
//MGMResourceWillLoadOriginal = MGMReplaceImplementation([LoadProgressMonitor class], @selector(webView:resource:willSendRequest:redirectResponse:fromDataSource:), (IMP)MGMResourceWillLoadOverride);
//MGMLoadFinishedOriginal = MGMReplaceImplementation([BrowserWindowController class], @selector(webViewProgressHasFinished:), (IMP)MGMLoadFinishedOverride);
MGMSwizzle([LoadProgressMonitor class], @selector(webView:resource:willSendRequest:redirectResponse:fromDataSource:), [self class], @selector(webView:resource:willSendRequest:redirectResponse:fromDataSource:));
MGMSwizzle([BrowserWindowController class], @selector(webViewProgressHasFinished:), [self class], @selector(webViewProgressHasFinished:));
//method_exchangeImplementations(class_getInstanceMethod([LoadProgressMonitor class], @selector(webView:resource:willSendRequest:redirectResponse:fromDataSource:)), class_getInstanceMethod([self class], @selector(webView:resource:willSendRequest:redirectResponse:fromDataSource:)));
//method_exchangeImplementations(class_getInstanceMethod([BrowserWindowController class], @selector(webViewProgressHasFinished:)), class_getInstanceMethod([self class], @selector(webViewProgressHasFinished:)));
NSMenu *applicationMenu = [[[NSApp mainMenu] itemAtIndex:0] submenu];
for (int i=0; i<[applicationMenu numberOfItems]; i++) {
if ([[applicationMenu itemAtIndex:i] isSeparatorItem]) {
SpruceSSLMenu = [[[NSMenuItem alloc] initWithTitle:@"SpruceSSL Preferences" action:@selector(showPreferences:) keyEquivalent:@""] autorelease];
[SpruceSSLMenu setTarget:self];
[applicationMenu insertItem:SpruceSSLMenu atIndex:i];
break;
}
}
}
- (void)willTerminate {
[updater release];
[blacklist release];
[whitelist release];
}
- (void)registerDefaults {
NSMutableDictionary *defaults = [NSMutableDictionary dictionary];
[defaults setObject:[NSNumber numberWithInt:0] forKey:MGMChangeCookies];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
}
- (NSURLRequest *)webView:(WebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(WebDataSource *)dataSource {
NSLog(@"Hello from bla");
MGMSpruceSSL *spruceSSL = [MGMSpruceSSL sharedInstance];
if ([[request URL] host]!=nil && ![[[[[sender mainFrame] dataSource] request] URL] isEqualTo:[request URL]] && [[[request URL] scheme] isEqual:@"http"] && [spruceSSL isSSLForHost:[[request URL] host]]) {
NSMutableURLRequest *sslRequest = [[request mutableCopy] autorelease];
NSMutableString *url = [[[[request URL] absoluteString] mutableCopy] autorelease];
[url insertString:@"s" atIndex:4];
[sslRequest setURL:[NSURL URLWithString:url]];
return [spruceSSL webView:sender resource:identifier willSendRequest:sslRequest redirectResponse:redirectResponse fromDataSource:dataSource];
}
return [spruceSSL webView:sender resource:identifier willSendRequest:request redirectResponse:redirectResponse fromDataSource:dataSource];
}
- (void)webViewProgressHasFinished:(WebView *)sender {
MGMSpruceSSL *spruceSSL = [MGMSpruceSSL sharedInstance];
NSURL *url = [NSURL URLWithString:[sender mainFrameURL]];
if ([url host]!=nil && [[url scheme] isEqual:@"https"] && (([[NSUserDefaults standardUserDefaults] integerForKey:MGMChangeCookies]==1 && [spruceSSL isSSLForHost:[url host]]) || ([[NSUserDefaults standardUserDefaults] integerForKey:MGMChangeCookies]==2 && ![spruceSSL isHostBlackListed:[url host]]))) {
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *cookies = [storage cookiesForURL:url];
for (unsigned int i=0; i<[cookies count]; i++) {
if (![[cookies objectAtIndex:i] isSecure]) {
NSMutableDictionary *cookie = [[[cookies objectAtIndex:i] properties] mutableCopy];
[cookie setObject:[NSNumber numberWithBool:YES] forKey:NSHTTPCookieSecure];
[storage setCookie:[NSHTTPCookie cookieWithProperties:cookie]];
[cookie release];
}
}
}
[spruceSSL webViewProgressHasFinished:sender];
}
- (IBAction)showPreferences:(id)sender {
if (preferencesWindow==nil) {
if (![NSBundle loadNibNamed:@"preferences" owner:self]) {
NSLog(@"Unable to load preferences for SpruceSSL");
} else {
NSBundle *bundle = [NSBundle bundleForClass:[MGMSpruceSSL class]];
[nameField setStringValue:[NSString stringWithFormat:@"%@ %@", [bundle objectForInfoDictionaryKey:(NSString *)kCFBundleNameKey], [bundle objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey]]];
[changeCookiesMatrix selectCellAtRow:[[NSUserDefaults standardUserDefaults] integerForKey:MGMChangeCookies] column:0];
[wlRemoveButton setEnabled:NO];
[blRemoveButton setEnabled:NO];
}
}
[preferencesWindow makeKeyAndOrderFront:self];
}
- (IBAction)changeCookies:(id)sender {
[[NSUserDefaults standardUserDefaults] setInteger:[changeCookiesMatrix selectedRow] forKey:MGMChangeCookies];
}
- (IBAction)checkForUpdate:(id)sender {
[updater checkForUpdates:sender];
}
- (IBAction)donate:(id)sender {
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=SA4DEZGVJSNAL"]];
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)theTableView {
if (theTableView==whitelistTable)
return [whitelist count];
return [blacklist count];
}
- (id)tableView:(NSTableView *)theTableView objectValueForTableColumn:(NSTableColumn *)theTableColumn row:(NSInteger)rowIndex {
if (theTableView==whitelistTable)
return [whitelist objectAtIndex:rowIndex];
return [blacklist objectAtIndex:rowIndex];
}
- (void)tableView:(NSTableView *)theTableView setObjectValue:(id)theObject forTableColumn:(NSTableColumn *)theTableColumn row:(NSInteger)rowIndex {
if (theTableView==whitelistTable) {
[whitelist replaceObjectAtIndex:rowIndex withObject:theObject];
[whitelist writeToFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostWhitelist] atomically:NO];
} else {
[blacklist replaceObjectAtIndex:rowIndex withObject:theObject];
[blacklist writeToFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostBlacklist] atomically:NO];
}
}
- (void)tableViewSelectionDidChange:(NSNotification *)theNotification {
if ([theNotification object]==whitelistTable)
[wlRemoveButton setEnabled:([whitelistTable selectedRow]>=0)];
else
[blRemoveButton setEnabled:([blacklistTable selectedRow]>=0)];
}
- (IBAction)wlAdd:(id)sender {
[whitelist addObject:@".example.com"];
[whitelistTable reloadData];
[whitelistTable editColumn:0 row:[whitelist count]-1 withEvent:nil select:YES];
[whitelist writeToFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostWhitelist] atomically:NO];
}
- (IBAction)wlRemove:(id)sender {
[whitelist removeObjectAtIndex:[whitelistTable selectedRow]];
[whitelistTable reloadData];
[whitelist writeToFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostWhitelist] atomically:NO];
}
- (IBAction)blAdd:(id)sender {
[blacklist addObject:@".example.com"];
[blacklistTable reloadData];
[blacklistTable editColumn:0 row:[blacklist count]-1 withEvent:nil select:YES];
[blacklist writeToFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostBlacklist] atomically:NO];
}
- (IBAction)blRemove:(id)sender {
[blacklist removeObjectAtIndex:[blacklistTable selectedRow]];
[blacklistTable reloadData];
[blacklist writeToFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostBlacklist] atomically:NO];
}
- (void)windowWillClose:(NSNotification *)theNotification {
preferencesWindow = nil;
}
- (BOOL)doesList:(NSArray *)theList containHost:(NSString *)theHost {
for (unsigned int i=0; i<[theList count]; i++) {
NSString *host = [theList objectAtIndex:i];
if ([host hasPrefix:@"."]) {
if ([host isEqual:[@"." stringByAppendingString:theHost]]) {
return YES;
} else {
NSMutableArray *domainComponets = [NSMutableArray arrayWithArray:[theHost componentsSeparatedByString:@"."]];
for (int d=0; d<[domainComponets count]; d++) {
[domainComponets removeObjectAtIndex:0];
if ([host isEqual:[@"." stringByAppendingString:[domainComponets componentsJoinedByString:@"."]]]) {
return YES;
break;
}
}
}
} else if ([host isEqual:theHost]) {
return YES;
}
}
return NO;
}
- (BOOL)isHostBlackListed:(NSString *)theHost {
return [self doesList:blacklist containHost:theHost];
}
- (BOOL)isHostWhiteListed:(NSString *)theHost {
return [self doesList:whitelist containHost:theHost];
}
- (BOOL)isSSLForHost:(NSString *)theHost {
if ([self isHostBlackListed:theHost])
return NO;
return [self isHostWhiteListed:theHost];
}
@end

52
Classes/MGMSpruceSSL.h

@ -0,0 +1,52 @@
//
// MGMSpruceSSL.h
// SpruceSSL
//
// Created by Mr. Gecko on 10/31/10.
// Copyright (c) 2010 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Cocoa/Cocoa.h>
@class SUUpdater;
extern NSString * const MGMChangeCookies;
#define MGMSpruceDebug 1
@interface MGMSpruceSSL : NSObject {
SUUpdater *updater;
NSMenuItem *SpruceSSLMenu;
NSMutableArray *blacklist;
NSMutableArray *whitelist;
IBOutlet NSWindow *preferencesWindow;
IBOutlet NSTextField *nameField;
IBOutlet NSMatrix *changeCookiesMatrix;
IBOutlet NSTableView *whitelistTable;
IBOutlet NSButton *wlRemoveButton;
IBOutlet NSTableView *blacklistTable;
IBOutlet NSButton *blRemoveButton;
}
+ (MGMSpruceSSL *)sharedController;
- (IBAction)changeCookies:(id)sender;
- (IBAction)checkForUpdate:(id)sender;
- (IBAction)donate:(id)sender;
- (IBAction)wlAdd:(id)sender;
- (IBAction)wlRemove:(id)sender;
- (IBAction)blAdd:(id)sender;
- (IBAction)blRemove:(id)sender;
- (NSURLRequest *)requestForRequest:(NSURLRequest *)request;
- (BOOL)doesList:(NSArray *)theList containHost:(NSString *)theHost;
- (BOOL)isHostBlackListed:(NSString *)theHost;
- (BOOL)isHostWhiteListed:(NSString *)theHost;
- (BOOL)isSSLForHost:(NSString *)theHost;
@end

385
Classes/MGMSpruceSSL.m

@ -0,0 +1,385 @@
//
// MGMSpruceSSL.m
// SpruceSSL
//
// Created by Mr. Gecko on 10/31/10.
// Copyright (c) 2010 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMSpruceSSL.h"
#import "MGMWebViewMethods.h"
#import "MGMSpruceURL.h"
#import "Safari.h"
#import <objc/objc.h>
#import <objc/objc-class.h>
#import <objc/objc-runtime.h>
#import <Sparkle/Sparkle.h>
@protocol MGMFileManagerProtocol <NSObject>
- (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary *)attributes error:(NSError **)error;
- (BOOL)createDirectoryAtPath:(NSString *)path attributes:(NSDictionary *)attributes;
- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;
- (BOOL)removeFileAtPath:(NSString *)path handler:(id)handler;
- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
- (BOOL)copyPath:(NSString *)source toPath:(NSString *)destination handler:(id)handler;
- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
- (BOOL)movePath:(NSString *)source toPath:(NSString *)destination handler:(id)handler;
@end
NSString * const MGMSpruceSSLDBChanged = @"MGMSpruceSSLDBChanged";
NSString * const MGMChangeCookies = @"MGMChangeCookies";
NSString * const MGMApplicationSupportPath = @"~/Library/Application Support/MrGeckosMedia/SpruceSSL/";
NSString * const MGMHostWhitelist = @"hostWhitelist.plist";
NSString * const MGMHostBlacklist = @"hostBlacklist.plist";
static MGMSpruceSSL *MGMSpruceSSLShared;
void _objc_flush_caches(Class cls);
void MGMSwizzle(Class class, SEL selector1, SEL selector2) {
#if OBJC_API_VERSION >= 2
Method method1 = class_getInstanceMethod(class, selector1);
Method method2 = class_getInstanceMethod(class, selector2);
class_addMethod(class, selector1, class_getMethodImplementation(class, selector1), method_getTypeEncoding(method1));
class_addMethod(class, selector2, class_getMethodImplementation(class, selector2), method_getTypeEncoding(method2));
if (method1==NULL || method2==NULL) {
NSLog(@"Unable to swizzle %@ with %@ in class %@", NSStringFromSelector(selector1), NSStringFromSelector(selector2), NSStringFromClass(class));
return;
}
method_exchangeImplementations(class_getInstanceMethod(class, selector1), class_getInstanceMethod(class, selector2));
#else
Method method1 = NULL, method2 = NULL;
void *iterator = NULL;
struct objc_method_list *list = class_nextMethodList(class, &iterator);
while (list!=NULL) {
for (int i=0; i<list->method_count; i++) {
if (list->method_list[i].method_name==selector1 && method1==NULL)
method1 = &list->method_list[i];
if (list->method_list[i].method_name==selector2 && method2==NULL)
method2 = &list->method_list[i];
}
if (method1!=NULL)
break;
list = class_nextMethodList(class, &iterator);
}
if (method1==NULL || method2==NULL) {
NSLog(@"Unable to swizzle %@ with %@ in class %@", NSStringFromSelector(selector1), NSStringFromSelector(selector2), NSStringFromClass(class));
return;
}
IMP implementation1 = method1->method_imp;
IMP implementation2 = method2->method_imp;
method1->method_imp = implementation2;
method2->method_imp = implementation1;
#endif
_objc_flush_caches(class);
}
@implementation MGMSpruceSSL
+ (void)initialize {
[self sharedController];
}
+ (void)load {
[self sharedController];
}
+ (MGMSpruceSSL *)sharedController {
@synchronized(self) {
if (MGMSpruceSSLShared==nil)
[[self alloc] init];
}
return MGMSpruceSSLShared;
}
+ (id)allocWithZone:(NSZone *)zone {
@synchronized(self) {
if (MGMSpruceSSLShared==nil) {
MGMSpruceSSLShared = [super allocWithZone:zone];
return MGMSpruceSSLShared;
}
}
return nil;
}
- (id)init {
if (self = [super init]) {
NSString *identifier = [[NSBundle mainBundle] bundleIdentifier];
NSArray *supportedIdentifiers = [[[NSBundle bundleForClass:[MGMSpruceSSL class]] infoDictionary] objectForKey:@"MGMSupported"];
BOOL shouldLoad = NO;
for (int i=0; i<[supportedIdentifiers count]; i++) {
if ([[supportedIdentifiers objectAtIndex:i] isEqual:identifier] || ([[supportedIdentifiers objectAtIndex:i] hasSuffix:@"."] && [identifier hasPrefix:[supportedIdentifiers objectAtIndex:i]])) {
shouldLoad = YES;
break;
}
}
if (!shouldLoad) {
[super release];
return nil;
}
updater = [SUUpdater alloc];
if ([updater respondsToSelector:@selector(initForBundle:)]) {
[updater initForBundle:[NSBundle bundleForClass:[MGMSpruceSSL class]]];
} else if ([updater respondsToSelector:@selector(setHostBundle:)]) {
[updater init];
[updater performSelector:@selector(setHostBundle:) withObject:[NSBundle bundleForClass:[MGMSpruceSSL class]]];
} else {
[updater release];
updater = nil;
}
NSFileManager<MGMFileManagerProtocol> *manager = [NSFileManager defaultManager];
if (![manager fileExistsAtPath:[MGMApplicationSupportPath stringByExpandingTildeInPath]]) {
if ([manager respondsToSelector:@selector(createDirectoryAtPath:attributes:)]) {
[manager createDirectoryAtPath:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByDeletingLastPathComponent] attributes:nil];
[manager createDirectoryAtPath:[MGMApplicationSupportPath stringByExpandingTildeInPath] attributes:nil];
} else {
[manager createDirectoryAtPath:[MGMApplicationSupportPath stringByExpandingTildeInPath] withIntermediateDirectories:YES attributes:nil error:nil];
}
}
if (![manager fileExistsAtPath:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostWhitelist]]) {
whitelist = [[NSMutableArray arrayWithContentsOfFile:[[[NSBundle bundleForClass:[MGMSpruceSSL class]] resourcePath] stringByAppendingPathComponent:MGMHostWhitelist]] retain];
[whitelist writeToFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostWhitelist] atomically:NO];
} else {
whitelist = [[NSMutableArray arrayWithContentsOfFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostWhitelist]] retain];
}
if (![manager fileExistsAtPath:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostBlacklist]]) {
blacklist = [[NSMutableArray arrayWithContentsOfFile:[[[NSBundle bundleForClass:[MGMSpruceSSL class]] resourcePath] stringByAppendingPathComponent:MGMHostBlacklist]] retain];
[blacklist writeToFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostBlacklist] atomically:NO];
} else {
blacklist = [[NSMutableArray arrayWithContentsOfFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostBlacklist]] retain];
}
MGMSwizzle([NSURLConnection class], @selector(initWithRequest:delegate:startImmediately:), @selector(MGMInitWithRequest:delegate:startImmediately:));
MGMSwizzle([NSURLConnection class], @selector(initWithRequest:delegate:), @selector(MGMInitWithRequest:delegate:));
MGMSwizzle([NSURLConnection class], @selector(initWithRequest:delegate:priority:), @selector(MGMInitWithRequest:delegate:priority:));
MGMSwizzle([NSURLConnection class], @selector(_initWithRequest:delegate:usesCache:maxContentLength:startImmediately:connectionProperties:), @selector(MGMInitWithRequest:delegate:usesCache:maxContentLength:startImmediately:connectionProperties:));
[NSURLProtocol registerClass:[MGMSpruceURL class]];
NSMenu *applicationMenu = [[[NSApp mainMenu] itemAtIndex:0] submenu];
for (int i=0; i<[applicationMenu numberOfItems]; i++) {
if ([[applicationMenu itemAtIndex:i] isSeparatorItem]) {
SpruceSSLMenu = [[[NSMenuItem alloc] initWithTitle:@"SpruceSSL Preferences" action:@selector(showPreferences:) keyEquivalent:@""] autorelease];
[SpruceSSLMenu setTarget:self];
[applicationMenu insertItem:SpruceSSLMenu atIndex:i];
break;
}
}
NSNotificationCenter *notifications = [NSNotificationCenter defaultCenter];
[notifications addObserver:self selector:@selector(willTerminate) name:NSApplicationWillTerminateNotification object:nil];
[notifications addObserver:self selector:@selector(cookieCheck:) name:WebViewProgressFinishedNotification object:nil];
[[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(dbChanged) name:MGMSpruceSSLDBChanged object:nil];
NSLog(@"SpruceSSL loaded successfully");
}
return self;
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
- (id)retain {
return self;
}
- (NSUInteger)retainCount {
return UINT_MAX;
}
- (void)release {
}
- (id)autorelease {
return self;
}
- (void)willTerminate {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[[NSDistributedNotificationCenter defaultCenter] removeObserver:self];
[updater release];
[blacklist release];
[whitelist release];
}
- (void)registerDefaults {
NSMutableDictionary *defaults = [NSMutableDictionary dictionary];
[defaults setObject:[NSNumber numberWithInt:0] forKey:MGMChangeCookies];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
}
- (void)dbChanged:(NSNotification *)theNotification {
if ([theNotification object]!=self) {
[whitelist release];
whitelist = [[NSMutableArray arrayWithContentsOfFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostWhitelist]] retain];
[blacklist release];
blacklist = [[NSMutableArray arrayWithContentsOfFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostBlacklist]] retain];
if (preferencesWindow!=nil) {
[whitelistTable reloadData];
[blacklistTable reloadData];
}
}
}
- (void)saveDB {
[whitelist writeToFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostWhitelist] atomically:NO];
[blacklist writeToFile:[[MGMApplicationSupportPath stringByExpandingTildeInPath] stringByAppendingPathComponent:MGMHostBlacklist] atomically:NO];
[[NSDistributedNotificationCenter defaultCenter] postNotificationName:MGMSpruceSSLDBChanged object:self];
}
- (IBAction)showPreferences:(id)sender {
if (preferencesWindow==nil) {
if (![NSBundle loadNibNamed:@"preferences" owner:self]) {
NSLog(@"Unable to load preferences for SpruceSSL");
} else {
NSBundle *bundle = [NSBundle bundleForClass:[MGMSpruceSSL class]];
[nameField setStringValue:[NSString stringWithFormat:@"%@ %@", [bundle objectForInfoDictionaryKey:(NSString *)kCFBundleNameKey], [bundle objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey]]];
[changeCookiesMatrix selectCellAtRow:[[NSUserDefaults standardUserDefaults] integerForKey:MGMChangeCookies] column:0];
[wlRemoveButton setEnabled:NO];
[blRemoveButton setEnabled:NO];
}
}
[preferencesWindow makeKeyAndOrderFront:self];
}
- (IBAction)changeCookies:(id)sender {
[[NSUserDefaults standardUserDefaults] setInteger:[changeCookiesMatrix selectedRow] forKey:MGMChangeCookies];
}
- (IBAction)checkForUpdate:(id)sender {
[updater checkForUpdates:sender];
}
- (IBAction)donate:(id)sender {
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=SA4DEZGVJSNAL"]];
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)theTableView {
if (theTableView==whitelistTable)
return [whitelist count];
return [blacklist count];
}
- (id)tableView:(NSTableView *)theTableView objectValueForTableColumn:(NSTableColumn *)theTableColumn row:(NSInteger)rowIndex {
if (theTableView==whitelistTable)
return [whitelist objectAtIndex:rowIndex];
return [blacklist objectAtIndex:rowIndex];
}
- (void)tableView:(NSTableView *)theTableView setObjectValue:(id)theObject forTableColumn:(NSTableColumn *)theTableColumn row:(NSInteger)rowIndex {
if (theTableView==whitelistTable) {
[whitelist replaceObjectAtIndex:rowIndex withObject:theObject];
[self saveDB];
} else {
[blacklist replaceObjectAtIndex:rowIndex withObject:theObject];
[self saveDB];
}
}
- (void)tableViewSelectionDidChange:(NSNotification *)theNotification {
if ([theNotification object]==whitelistTable)
[wlRemoveButton setEnabled:([whitelistTable selectedRow]>=0)];
else
[blRemoveButton setEnabled:([blacklistTable selectedRow]>=0)];
}
- (IBAction)wlAdd:(id)sender {
[whitelist addObject:@".example.com"];
[whitelistTable reloadData];
[whitelistTable editColumn:0 row:[whitelist count]-1 withEvent:nil select:YES];
[self saveDB];
}
- (IBAction)wlRemove:(id)sender {
[whitelist removeObjectAtIndex:[whitelistTable selectedRow]];
[whitelistTable reloadData];
[self saveDB];
}
- (IBAction)blAdd:(id)sender {
[blacklist addObject:@".example.com"];
[blacklistTable reloadData];
[blacklistTable editColumn:0 row:[blacklist count]-1 withEvent:nil select:YES];
[self saveDB];
}
- (IBAction)blRemove:(id)sender {
[blacklist removeObjectAtIndex:[blacklistTable selectedRow]];
[blacklistTable reloadData];
[self saveDB];
}
- (void)windowWillClose:(NSNotification *)theNotification {
preferencesWindow = nil;
}
- (void)cookieCheck:(NSNotification *)theNotification {
if ([[theNotification object] mainFrameURL]!=nil) {
#if MGMSpruceDebug
NSLog(@"Cookie check %@", [[theNotification object] mainFrameURL]);
#endif
MGMSpruceSSL *spruceSSL = [MGMSpruceSSL sharedController];
NSURL *url = [NSURL URLWithString:[[theNotification object] mainFrameURL]];
if ([url host]!=nil && [[url scheme] isEqual:@"https"] && (([[NSUserDefaults standardUserDefaults] integerForKey:MGMChangeCookies]==1 && [spruceSSL isSSLForHost:[url host]]) || ([[NSUserDefaults standardUserDefaults] integerForKey:MGMChangeCookies]==2 && ![spruceSSL isHostBlackListed:[url host]]))) {
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *cookies = [storage cookiesForURL:url];
for (unsigned int i=0; i<[cookies count]; i++) {
if (![[cookies objectAtIndex:i] isSecure]) {
NSMutableDictionary *cookie = [[[cookies objectAtIndex:i] properties] mutableCopy];
[cookie setObject:[NSNumber numberWithBool:YES] forKey:NSHTTPCookieSecure];
[storage setCookie:[NSHTTPCookie cookieWithProperties:cookie]];
[cookie release];
}
}
}
}
}
- (NSURLRequest *)requestForRequest:(NSURLRequest *)request {
if ([[request URL] host]!=nil && [[[request URL] scheme] isEqual:@"http"] && [self isSSLForHost:[[request URL] host]]) {
NSMutableURLRequest *sslRequest = [[request mutableCopy] autorelease];
NSString *url = [[sslRequest URL] absoluteString];
NSRange range = [url rangeOfString:@":"];
url = [@"sprucessl" stringByAppendingString:[url substringFromIndex:range.location]];
#if MGMSpruceDebug
NSLog(@"%@", url);
#endif
[sslRequest setURL:[NSURL URLWithString:url]];
return sslRequest;
}
return request;
}
- (BOOL)doesList:(NSArray *)theList containHost:(NSString *)theHost {
for (unsigned int i=0; i<[theList count]; i++) {
NSString *host = [theList objectAtIndex:i];
if ([host hasPrefix:@"."]) {
if ([host isEqual:[@"." stringByAppendingString:theHost]]) {
return YES;
} else {
NSMutableArray *domainComponets = [NSMutableArray arrayWithArray:[theHost componentsSeparatedByString:@"."]];
for (int d=0; d<[domainComponets count]; d++) {
[domainComponets removeObjectAtIndex:0];
if ([host isEqual:[@"." stringByAppendingString:[domainComponets componentsJoinedByString:@"."]]]) {
return YES;
break;
}
}
}
} else if ([host isEqual:theHost]) {
return YES;
}
}
return NO;
}
- (BOOL)isHostBlackListed:(NSString *)theHost {
return [self doesList:blacklist containHost:theHost];
}
- (BOOL)isHostWhiteListed:(NSString *)theHost {
return [self doesList:whitelist containHost:theHost];
}
- (BOOL)isSSLForHost:(NSString *)theHost {
if ([self isHostBlackListed:theHost])
return NO;
return [self isHostWhiteListed:theHost];
}
@end

15
Classes/MGMSpruceURL.h

@ -0,0 +1,15 @@
//
// MGMSpruceURL.h
// SpruceSSL
//
// Created by Mr. Gecko on 11/2/10.
// Copyright (c) 2010 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Cocoa/Cocoa.h>
@interface MGMSpruceURL : NSURLProtocol {
}
@end

39
Classes/MGMSpruceURL.m

@ -0,0 +1,39 @@
//
// MGMSpruceURL.m
// SpruceSSL
//
// Created by Mr. Gecko on 11/2/10.
// Copyright (c) 2010 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMSpruceURL.h"
@implementation MGMSpruceURL
+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
if ([[[[request URL] scheme] lowercaseString] isEqualToString:@"sprucessl"])
return YES;
return NO;
}
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
return request;
}
- (void)startLoading {
NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[[self request] URL] MIMEType:@"text/html" expectedContentLength:0 textEncodingName:nil];
NSMutableURLRequest *request = [[self request] mutableCopy];
NSString *url = [[request URL] absoluteString];
NSRange range = [url rangeOfString:@":"];
url = [@"https" stringByAppendingString:[url substringFromIndex:range.location]];
[request setURL:[NSURL URLWithString:url]];
id<NSURLProtocolClient> client = [self client];
[client URLProtocol:self wasRedirectedToRequest:request redirectResponse:response];
[client URLProtocolDidFinishLoading:self];
[request release];
[response release];
}
- (void)stopLoading {
}
@end

16
Classes/MGMWebViewMethods.h

@ -0,0 +1,16 @@
//
// MGMWebViewMethods.h
// SpruceSSL
//
// Created by Mr. Gecko on 11/2/10.
// Copyright (c) 2010 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <Cocoa/Cocoa.h>
#import "Safari.h"
#import "MGMSpruceSSL.h"
@interface NSURLConnection (MGMWebViewMethods)
- (id)MGMInitWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately;
- (id)MGMInitWithRequest:(NSURLRequest *)request delegate:(id)delegate usesCache:(BOOL)usesCacheFlag maxContentLength:(long long)maxContentLength startImmediately:(BOOL)startImmediately connectionProperties:(NSDictionary *)connectionProperties;
@end

25
Classes/MGMWebViewMethods.m

@ -0,0 +1,25 @@
//
// MGMWebViewMethods.m
// SpruceSSL
//
// Created by Mr. Gecko on 11/2/10.
// Copyright (c) 2010 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMWebViewMethods.h"
#import "MGMSpruceSSL.h"
@implementation NSURLConnection (MGMWebViewMethods)
- (id)MGMInitWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately {
return [self MGMInitWithRequest:[[MGMSpruceSSL sharedController] requestForRequest:request] delegate:delegate startImmediately:startImmediately];
}
- (id)MGMInitWithRequest:(NSURLRequest *)request delegate:(id)delegate {
return [self MGMInitWithRequest:[[MGMSpruceSSL sharedController] requestForRequest:request] delegate:delegate];
}
- (id)MGMInitWithRequest:(NSURLRequest *)request delegate:(id)delegate priority:(float)priority {
return [self MGMInitWithRequest:[[MGMSpruceSSL sharedController] requestForRequest:request] delegate:delegate priority:priority];
}
- (id)MGMInitWithRequest:(NSURLRequest *)request delegate:(id)delegate usesCache:(BOOL)usesCacheFlag maxContentLength:(long long)maxContentLength startImmediately:(BOOL)startImmediately connectionProperties:(NSDictionary *)connectionProperties {
return [self MGMInitWithRequest:[[MGMSpruceSSL sharedController] requestForRequest:request] delegate:delegate usesCache:usesCacheFlag maxContentLength:maxContentLength startImmediately:startImmediately connectionProperties:connectionProperties];
}
@end

9
Classes/Safari.h

@ -0,0 +1,9 @@
//
// Safari.h
// SpruceSSL
//
// Created by Mr. Gecko on 11/2/10.
// Copyright (c) 2010 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import <WebKit/WebKit.h>

7
Classes/SpruceSSL_Prefix.pch

@ -0,0 +1,7 @@
//
// Prefix header for all source files of the 'SpruceSSL' target in the 'SpruceSSL' project.
//
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#endif

1
Frameworks/Sparkle.framework/Headers

@ -0,0 +1 @@
Versions/Current/Headers

1
Frameworks/Sparkle.framework/Resources

@ -0,0 +1 @@
Versions/Current/Resources

1
Frameworks/Sparkle.framework/Sparkle

@ -0,0 +1 @@
Versions/Current/Sparkle

36
Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcast.h

@ -0,0 +1,36 @@
//
// SUAppcast.h
// Sparkle
//
// Created by Andy Matuschak on 3/12/06.
// Copyright 2006 Andy Matuschak. All rights reserved.
//
#ifndef SUAPPCAST_H
#define SUAPPCAST_H
@class SUAppcastItem;
@interface SUAppcast : NSObject
{
@private
NSArray *items;
NSString *userAgentString;
id delegate;
NSString *downloadFilename;
NSURLDownload *download;
}
- (void)fetchAppcastFromURL:(NSURL *)url;
- (void)setDelegate:delegate;
- (void)setUserAgentString:(NSString *)userAgentString;
- (NSArray *)items;
@end
@interface NSObject (SUAppcastDelegate)
- (void)appcastDidFinishLoading:(SUAppcast *)appcast;
- (void)appcast:(SUAppcast *)appcast failedToLoadWithError:(NSError *)error;
@end
#endif

54
Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h

@ -0,0 +1,54 @@
//
// SUAppcastItem.h
// Sparkle
//
// Created by Andy Matuschak on 3/12/06.
// Copyright 2006 Andy Matuschak. All rights reserved.
//
#ifndef SUAPPCASTITEM_H
#define SUAPPCASTITEM_H
@interface SUAppcastItem : NSObject
{
@private
NSString *title;
NSDate *date;
NSString *itemDescription;
NSURL *releaseNotesURL;
NSString *DSASignature;
NSString *minimumSystemVersion;
NSURL *fileURL;
NSString *versionString;
NSString *displayVersionString;
NSDictionary *deltaUpdates;
NSDictionary *propertiesDictionary;
}
// Initializes with data from a dictionary provided by the RSS class.
- initWithDictionary:(NSDictionary *)dict;
- initWithDictionary:(NSDictionary *)dict failureReason:(NSString**)error;
- (NSString *)title;
- (NSString *)versionString;
- (NSString *)displayVersionString;
- (NSDate *)date;
- (NSString *)itemDescription;
- (NSURL *)releaseNotesURL;
- (NSURL *)fileURL;
- (NSString *)DSASignature;
- (NSString *)minimumSystemVersion;
- (NSDictionary *)deltaUpdates;
- (BOOL)isDeltaUpdate;
// Returns the dictionary provided in initWithDictionary; this might be useful later for extensions.
- (NSDictionary *)propertiesDictionary;
@end
#endif

126
Frameworks/Sparkle.framework/Versions/A/Headers/SUUpdater.h

@ -0,0 +1,126 @@
//
// SUUpdater.h
// Sparkle
//
// Created by Andy Matuschak on 1/4/06.
// Copyright 2006 Andy Matuschak. All rights reserved.
//
#ifndef SUUPDATER_H
#define SUUPDATER_H
#import <Sparkle/SUVersionComparisonProtocol.h>
@class SUUpdateDriver, SUAppcastItem, SUHost, SUAppcast;
@interface SUUpdater : NSObject
{
@private
NSTimer *checkTimer;
SUUpdateDriver *driver;
NSString *customUserAgentString;
SUHost *host;
IBOutlet id delegate;
}
+ (SUUpdater *)sharedUpdater;
+ (SUUpdater *)updaterForBundle:(NSBundle *)bundle;
- initForBundle:(NSBundle *)bundle;
- (NSBundle *)hostBundle;
- (void)setDelegate:(id)delegate;
- delegate;
- (void)setAutomaticallyChecksForUpdates:(BOOL)automaticallyChecks;
- (BOOL)automaticallyChecksForUpdates;
- (void)setUpdateCheckInterval:(NSTimeInterval)interval;
- (NSTimeInterval)updateCheckInterval;
- (void)setFeedURL:(NSURL *)feedURL;
- (NSURL *)feedURL;
- (void)setUserAgentString:(NSString *)userAgent;
- (NSString *)userAgentString;
- (void)setSendsSystemProfile:(BOOL)sendsSystemProfile;
- (BOOL)sendsSystemProfile;
- (void)setAutomaticallyDownloadsUpdates:(BOOL)automaticallyDownloadsUpdates;
- (BOOL)automaticallyDownloadsUpdates;
// This IBAction is meant for a main menu item. Hook up any menu item to this action,
// and Sparkle will check for updates and report back its findings verbosely.
- (IBAction)checkForUpdates:sender;
// This kicks off an update meant to be programmatically initiated. That is, it will display no UI unless it actually finds an update,
// in which case it proceeds as usual. If the fully automated updating is turned on, however, this will invoke that behavior, and if an
// update is found, it will be downloaded and prepped for installation.
- (void)checkForUpdatesInBackground;
// Date of last update check. Returns null if no check has been performed.
- (NSDate*)lastUpdateCheckDate;
// This begins a "probing" check for updates which will not actually offer to update to that version. The delegate methods, though,
// (up to updater:didFindValidUpdate: and updaterDidNotFindUpdate:), are called, so you can use that information in your UI.
- (void)checkForUpdateInformation;
// Call this to appropriately schedule or cancel the update checking timer according to the preferences for time interval and automatic checks. This call does not change the date of the next check, but only the internal NSTimer.
- (void)resetUpdateCycle;
- (BOOL)updateInProgress;
@end
@interface NSObject (SUUpdaterDelegateInformalProtocol)
// This method allows you to add extra parameters to the appcast URL, potentially based on whether or not Sparkle will also be sending along the system profile. This method should return an array of dictionaries with keys: "key", "value", "displayKey", "displayValue", the latter two being specifically for display to the user.
- (NSArray *)feedParametersForUpdater:(SUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile;
// Use this to override the default behavior for Sparkle prompting the user about automatic update checks.
- (BOOL)updaterShouldPromptForPermissionToCheckForUpdates:(SUUpdater *)bundle;
// Implement this if you want to do some special handling with the appcast once it finishes loading.
- (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast;
// If you're using special logic or extensions in your appcast, implement this to use your own logic for finding
// a valid update, if any, in the given appcast.
- (SUAppcastItem *)bestValidUpdateInAppcast:(SUAppcast *)appcast forUpdater:(SUUpdater *)bundle;
// Sent when a valid update is found by the update driver.
- (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)update;
// Sent when a valid update is not found.
- (void)updaterDidNotFindUpdate:(SUUpdater *)update;
// Sent immediately before installing the specified update.
- (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)update;
// Return YES to delay the relaunch until you do some processing; invoke the given NSInvocation to continue.
- (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)update untilInvoking:(NSInvocation *)invocation;
// Called immediately before relaunching.
- (void)updaterWillRelaunchApplication:(SUUpdater *)updater;
// This method allows you to provide a custom version comparator.
// If you don't implement this method or return nil, the standard version comparator will be used.
- (id <SUVersionComparison>)versionComparatorForUpdater:(SUUpdater *)updater;
// Returns the path which is used to relaunch the client after the update is installed. By default, the path of the host bundle.
- (NSString *)pathToRelaunchForUpdater:(SUUpdater *)updater;
@end
// Define some minimum intervals to avoid DOS-like checking attacks. These are in seconds.
#ifdef DEBUG
#define SU_MIN_CHECK_INTERVAL 60
#else
#define SU_MIN_CHECK_INTERVAL 60*60
#endif
#ifdef DEBUG
#define SU_DEFAULT_CHECK_INTERVAL 60
#else
#define SU_DEFAULT_CHECK_INTERVAL 60*60*24
#endif
#endif

27
Frameworks/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h

@ -0,0 +1,27 @@
//
// SUVersionComparisonProtocol.h
// Sparkle
//
// Created by Andy Matuschak on 12/21/07.
// Copyright 2007 Andy Matuschak. All rights reserved.
//
#ifndef SUVERSIONCOMPARISONPROTOCOL_H
#define SUVERSIONCOMPARISONPROTOCOL_H
/*!
@protocol
@abstract Implement this protocol to provide version comparison facilities for Sparkle.
*/
@protocol SUVersionComparison
/*!
@method
@abstract An abstract method to compare two version strings.
@discussion Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, and NSOrderedSame if they are equivalent.
*/
- (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB;
@end
#endif

21
Frameworks/Sparkle.framework/Versions/A/Headers/Sparkle.h

@ -0,0 +1,21 @@
//
// Sparkle.h
// Sparkle
//
// Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07)
// Copyright 2006 Andy Matuschak. All rights reserved.
//
#ifndef SPARKLE_H
#define SPARKLE_H
// This list should include the shared headers. It doesn't matter if some of them aren't shared (unless
// there are name-space collisions) so we can list all of them to start with:
#import <Sparkle/SUUpdater.h>
#import <Sparkle/SUAppcast.h>
#import <Sparkle/SUAppcastItem.h>
#import <Sparkle/SUVersionComparisonProtocol.h>
#endif

24
Frameworks/Sparkle.framework/Versions/A/Resources/Info.plist

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>Sparkle</string>
<key>CFBundleIdentifier</key>
<string>org.andymatuschak.Sparkle</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Sparkle</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.5 Beta (git)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>7baf505</string>
</dict>
</plist>

153
Frameworks/Sparkle.framework/Versions/A/Resources/License.txt

@ -0,0 +1,153 @@
Copyright (c) 2006 Andy Matuschak
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
=================
EXTERNAL LICENSES
=================
This project uses software developed by the OpenSSL Project for use in the OpenSSL
Toolkit (http://www.openssl.org). This toolkit is licensed as follows:
/* ====================================================================
* Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modiÞcation, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* ÒThis product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)Ó
*
* 4. The names ÒOpenSSL ToolkitÓ and ÒOpenSSL ProjectÓ must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* openssl-core@openssl.org.
*
* 5. Products derived from this software may not be called ÒOpenSSLÓ
* nor may ÒOpenSSLÓ appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* ÒThis product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.openssl.org/)Ó
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS ISÕÕ AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
Original SSLeay License
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
* by Eric Young (eay@cryptsoft.com).
* The implementation was written so as to conform with Netscapes SSL.
*
* This library is free for commercial and non-commercial use as long as
* the following conditions are aheared to. The following conditions
* apply to all code found in this distribution, be it the RC4, RSA,
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
* included with this distribution is covered by the same copyright terms
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
*
* Copyright remains Eric YoungÕs, and as such any Copyright notices in
* the code are not to be removed.
* If this package is used in a product, Eric Young should be given attribution
* as the author of the parts of the library used.
* This can be in the form of a textual message at program startup or
* in documentation (online or textual) provided with the package.
*
* Redistribution and use in source and binary forms, with or without
* modiÞcation, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* ÒThis product includes cryptographic software written by
* Eric Young (eay@cryptsoft.com)Ó
* The word ÔcryptographicÕ can be left out if the rouines from the library
* being used are not cryptographic related :-).
* 4. If you include any Windows speciÞc code (or a derivative thereof) from
* the apps directory (application code) you must include an acknowledgement:
* ÒThis product includes software written by Tim Hudson (tjh@cryptsoft.com)Ó
*
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS ISÕÕ AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* The licence and distribution terms for any publically available version or
* derivative of this code cannot be changed. i.e. this code cannot simply be
* copied and put under another distribution licence
* [including the GNU Public Licence.]
*/
License for bspatch.c and bsdiff.c, from bsdiff 4.3 (<http://www.daemonology.net/bsdiff/>:
/*-
* Copyright 2003-2005 Colin Percival
* All rights reserved
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted providing that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/

174
Frameworks/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist

@ -0,0 +1,174 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ADP2,1</key>
<string>Developer Transition Kit</string>
<key>MacBook1,1</key>
<string>MacBook (Core Duo)</string>
<key>MacBook2,1</key>
<string>MacBook (Core 2 Duo)</string>
<key>MacBook4,1</key>
<string>MacBook (Core 2 Duo Feb 2008)</string>
<key>MacBookAir1,1</key>
<string>MacBook Air (January 2008)</string>
<key>MacBookPro1,1</key>
<string>MacBook Pro Core Duo (15-inch)</string>
<key>MacBookPro1,2</key>
<string>MacBook Pro Core Duo (17-inch)</string>
<key>MacBookPro2,1</key>
<string>MacBook Pro Core 2 Duo (17-inch)</string>
<key>MacBookPro2,2</key>
<string>MacBook Pro Core 2 Duo (15-inch)</string>
<key>MacBookPro3,1</key>
<string>MacBook Pro Core 2 Duo (15-inch LED, Core 2 Duo)</string>
<key>MacBookPro3,2</key>
<string>MacBook Pro Core 2 Duo (17-inch HD, Core 2 Duo)</string>
<key>MacBookPro4,1</key>
<string>MacBook Pro (Core 2 Duo Feb 2008)</string>
<key>MacPro1,1</key>
<string>Mac Pro (four-core)</string>
<key>MacPro2,1</key>
<string>Mac Pro (eight-core)</string>
<key>MacPro3,1</key>
<string>Mac Pro (January 2008 4- or 8- core "Harpertown")</string>
<key>Macmini1,1</key>
<string>Mac Mini (Core Solo/Duo)</string>
<key>PowerBook1,1</key>
<string>PowerBook G3</string>
<key>PowerBook2,1</key>
<string>iBook G3</string>
<key>PowerBook2,2</key>
<string>iBook G3 (FireWire)</string>
<key>PowerBook2,3</key>
<string>iBook G3</string>
<key>PowerBook2,4</key>
<string>iBook G3</string>
<key>PowerBook3,1</key>
<string>PowerBook G3 (FireWire)</string>
<key>PowerBook3,2</key>
<string>PowerBook G4</string>
<key>PowerBook3,3</key>
<string>PowerBook G4 (Gigabit Ethernet)</string>
<key>PowerBook3,4</key>
<string>PowerBook G4 (DVI)</string>
<key>PowerBook3,5</key>
<string>PowerBook G4 (1GHz / 867MHz)</string>
<key>PowerBook4,1</key>
<string>iBook G3 (Dual USB, Late 2001)</string>
<key>PowerBook4,2</key>
<string>iBook G3 (16MB VRAM)</string>
<key>PowerBook4,3</key>
<string>iBook G3 Opaque 16MB VRAM, 32MB VRAM, Early 2003)</string>
<key>PowerBook5,1</key>
<string>PowerBook G4 (17 inch)</string>
<key>PowerBook5,2</key>
<string>PowerBook G4 (15 inch FW 800)</string>
<key>PowerBook5,3</key>
<string>PowerBook G4 (17-inch 1.33GHz)</string>
<key>PowerBook5,4</key>
<string>PowerBook G4 (15 inch 1.5/1.33GHz)</string>
<key>PowerBook5,5</key>
<string>PowerBook G4 (17-inch 1.5GHz)</string>
<key>PowerBook5,6</key>
<string>PowerBook G4 (15 inch 1.67GHz/1.5GHz)</string>
<key>PowerBook5,7</key>
<string>PowerBook G4 (17-inch 1.67GHz)</string>
<key>PowerBook5,8</key>
<string>PowerBook G4 (Double layer SD, 15 inch)</string>
<key>PowerBook5,9</key>
<string>PowerBook G4 (Double layer SD, 17 inch)</string>
<key>PowerBook6,1</key>
<string>PowerBook G4 (12 inch)</string>
<key>PowerBook6,2</key>
<string>PowerBook G4 (12 inch, DVI)</string>
<key>PowerBook6,3</key>
<string>iBook G4</string>
<key>PowerBook6,4</key>
<string>PowerBook G4 (12 inch 1.33GHz)</string>
<key>PowerBook6,5</key>
<string>iBook G4 (Early-Late 2004)</string>
<key>PowerBook6,7</key>
<string>iBook G4 (Mid 2005)</string>
<key>PowerBook6,8</key>
<string>PowerBook G4 (12 inch 1.5GHz)</string>
<key>PowerMac1,1</key>
<string>Power Macintosh G3 (Blue &amp; White)</string>
<key>PowerMac1,2</key>
<string>Power Macintosh G4 (PCI Graphics)</string>
<key>PowerMac10,1</key>
<string>Mac Mini G4</string>
<key>PowerMac10,2</key>
<string>Mac Mini (Late 2005)</string>
<key>PowerMac11,2</key>
<string>Power Macintosh G5 (Late 2005)</string>
<key>PowerMac12,1</key>
<string>iMac G5 (iSight)</string>
<key>PowerMac2,1</key>
<string>iMac G3 (Slot-loading CD-ROM)</string>
<key>PowerMac2,2</key>
<string>iMac G3 (Summer 2000)</string>
<key>PowerMac3,1</key>
<string>Power Macintosh G4 (AGP Graphics)</string>
<key>PowerMac3,2</key>
<string>Power Macintosh G4 (AGP Graphics)</string>
<key>PowerMac3,3</key>
<string>Power Macintosh G4 (Gigabit Ethernet)</string>
<key>PowerMac3,4</key>
<string>Power Macintosh G4 (Digital Audio)</string>
<key>PowerMac3,5</key>
<string>Power Macintosh G4 (Quick Silver)</string>
<key>PowerMac3,6</key>
<string>Power Macintosh G4 (Mirrored Drive Door)</string>
<key>PowerMac4,1</key>
<string>iMac G3 (Early/Summer 2001)</string>
<key>PowerMac4,2</key>
<string>iMac G4 (Flat Panel)</string>
<key>PowerMac4,4</key>
<string>eMac</string>
<key>PowerMac4,5</key>
<string>iMac G4 (17-inch Flat Panel)</string>
<key>PowerMac5,1</key>
<string>Power Macintosh G4 Cube</string>
<key>PowerMac6,1</key>
<string>iMac G4 (USB 2.0)</string>
<key>PowerMac6,3</key>
<string>iMac G4 (20-inch Flat Panel)</string>
<key>PowerMac6,4</key>
<string>eMac (USB 2.0, 2005)</string>
<key>PowerMac7,2</key>
<string>Power Macintosh G5</string>
<key>PowerMac7,3</key>
<string>Power Macintosh G5</string>
<key>PowerMac8,1</key>
<string>iMac G5</string>
<key>PowerMac8,2</key>
<string>iMac G5 (Ambient Light Sensor)</string>
<key>PowerMac9,1</key>
<string>Power Macintosh G5 (Late 2005)</string>
<key>RackMac1,1</key>
<string>Xserve G4</string>
<key>RackMac1,2</key>
<string>Xserve G4 (slot-loading, cluster node)</string>
<key>RackMac3,1</key>
<string>Xserve G5</string>
<key>Xserve1,1</key>
<string>Xserve (Intel Xeon)</string>
<key>Xserve2,1</key>
<string>Xserve (January 2008 quad-core)</string>
<key>iMac1,1</key>
<string>iMac G3 (Rev A-D)</string>
<key>iMac4,1</key>
<string>iMac (Core Duo)</string>
<key>iMac4,2</key>
<string>iMac for Education (17-inch, Core Duo)</string>
<key>iMac5,1</key>
<string>iMac (Core 2 Duo, 17 or 20 inch, SuperDrive)</string>
<key>iMac5,2</key>
<string>iMac (Core 2 Duo, 17 inch, Combo Drive)</string>
<key>iMac6,1</key>
<string>iMac (Core 2 Duo, 24 inch, SuperDrive)</string>
<key>iMac8,1</key>
<string>iMac (April 2008)</string>
</dict>
</plist>

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings

1
Frameworks/Sparkle.framework/Versions/A/Resources/fr_CA.lproj

@ -0,0 +1 @@
fr.lproj

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/Sparkle.strings

1
Frameworks/Sparkle.framework/Versions/A/Resources/pt.lproj

@ -0,0 +1 @@
pt_BR.lproj

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/relaunch

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUAutomaticUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.nib

BIN
Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings

BIN
Frameworks/Sparkle.framework/Versions/A/Sparkle

1
Frameworks/Sparkle.framework/Versions/Current

@ -0,0 +1 @@
A

20
License.txt

@ -0,0 +1,20 @@
Copyright (c) 2010 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
Permission is granted, to any person obtaining a copy of this bundle, to
use, copy, modify, merge, or redistribute this bundle under the following terms:
1. This file must be included in all copies of this bundle unmodified in
SpruceSSL.bundle/Resource/License.txt
2. THIS BUNDLE IS PROVIDED "AS IS" BY JAMES COLEMAN, WITHOUT WARRANTY OF
ANY KIND. IF YOUR SOFTWARE/BUNDLE/COMPUTER CRASH OR FAILS TO WORK IN ANY
WAY SHAPE OR FORM BECAUSE OF THIS BUNDLE, I (JAMES COLEMAN) AM NOT IN ANYWAY
RESPONSIBLE FOR YOUR PROBLEM. BUT, I MAY BE WILLING TO HELP YOU, NO PROMISES.
3. Redistributions of source code included in this bundle must retain the
copyright notice above this license file without modifications.
4. Redistributions of binary must contain the copyright above this license file
without modifications.
5. Mr. Gecko's Media (James Coleman) is allowed to modify these terms with little or no notice to anyone.

46
Readme.rtf

@ -0,0 +1,46 @@
{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\margl1440\margr1440\vieww9000\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\f0\fs30 \cf0 NOTICE: SpruceSSL will install SIMBL, (if not already installed) found at {\field{\*\fldinst{HYPERLINK "http://www.culater.net/software/SIMBL/SIMBL.php"}}{\fldrslt http://www.culater.net/software/SIMBL/SIMBL.php}} under the GPL Licenses, to insert SpruceSSL into your browser.
\fs26 \
\
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\fs24 \cf0 SpruceSSL is a open source plugin for many webkit based browsers that allows users to force websites to go through the SSL protocol (HTTPS) using a blacklist and a whitelist to protect you against the possibility of your accounts/information getting stolen. With the ability to also force cookies to be secure only (Meaning you can not access it out side of https), you can be sure your accounts/information will not get leaked with the whitelisted sites. Using SpruceSSL can help you protect against sslstrip and FireSheep.
\fs32 \
\
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\qc\pardirnatural
\cf0 Installation\
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\fs24 \cf0 To install SpruceSSL, quit Safari and follow through the steps in the installer. After installed, launch Safari and you are done.
\fs26 \
\
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\qc\pardirnatural
\fs32 \cf0 How to use
\fs26 \
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\fs24 \cf0 SpruceSSL adds a menu in the Safari menu named "SpruceSSL Preferences" which brings up the interface to SpruceSSL. In the interface you can add or remove things from the whitelist or blacklist, or have SpruceSSL secure you more by forcing cookies to be secure on the websites that are whitelisted. SpruceSSL comes with a default whitelist and blacklist that should get you started in your journey to be more secure.
\fs26 \
\
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\qc\pardirnatural
\fs32 \cf0 Open Source
\fs26 \
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\fs24 \cf0 SpruceSSL is open source at {\field{\*\fldinst{HYPERLINK "http://opensource.mrgeckosmedia.com/"}}{\fldrslt http://opensource.mrgeckosmedia.com/}}, please feel free to help out with the development of it.
\fs26 \
\
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\qc\pardirnatural
\fs34 \cf0 Donations
\fs26 \
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\fs24 \cf0 I accept donations with paypal at {\field{\*\fldinst{HYPERLINK "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=SA4DEZGVJSNAL"}}{\fldrslt https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=SA4DEZGVJSNAL}}.}

2
Resources/English.lproj/InfoPlist.strings

@ -0,0 +1,2 @@
/* Localized versions of Info.plist keys */

80
Resources/Info.plist

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string>SpruceSSL</string>
<key>CFBundleIdentifier</key>
<string>com.MrGeckosMedia.${PRODUCT_NAME:rfc1034Identifier}</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright (c) 2010 Mr. Gecko&apos;s Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>0.1</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>0.1</string>
<key>NSPrincipalClass</key>
<string>MGMSpruceSSL</string>
<key>SIMBLTargetApplications</key>
<array>
<dict>
<key>BundleIdentifier</key>
<string>com.apple.Safari</string>
<key>MaxBundleVersion</key>
<string>6533</string>
<key>MinBundleVersion</key>
<string>4525</string>
</dict>
<dict>
<key>BundleIdentifier</key>
<string>de.icab.iCab</string>
<key>MaxBundleVersion</key>
<string>6.0</string>
<key>MinBundleVersion</key>
<string>4.8</string>
</dict>
<dict>
<key>BundleIdentifier</key>
<string>*</string>
<key>MaxBundleVersion</key>
<string>90000000</string>
<key>MinBundleVersion</key>
<string>0</string>
</dict>
</array>
<key>SUCheckAtStartup</key>
<true/>
<key>SUEnableSystemProfiling</key>
<true/>
<key>SUFeedURL</key>
<string>http://mrgeckosmedia.com/applications/appcast/SpruceSSL</string>
<key>SUPublicDSAKeyFile</key>
<string>dsa_pub.pem</string>
<key>SUScheduledCheckInterval</key>
<integer>86400</integer>
<key>MGMSupported</key>
<array>
<string>com.apple.Safari</string>
<string>org.webkit.nightly.WebKit</string>
<string>de.icab.iCab</string>
<string>com.fluidapp.FluidInstance.</string>
<string>com.iindigo3d.surfDude</string>
<string>com.omnigroup.OmniWeb5</string>
<string>com.JMM.SplitBrowser</string>
<string>com.app4mac.GiddyUp</string>
<string>com.app4mac.wkioskApp</string>
<string>com.cruzapp.Cruz</string>
</array>
</dict>
</plist>

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save