Repository: opendns/dnscrypt-osx-client Branch: master Commit: 6c08e50dd2b6 Files: 99 Total size: 281.1 KB Directory structure: gitextract_t1_psfpw/ ├── DNSCrypt-Menubar/ │ ├── COPYING │ ├── DNSCrypt-Menubar/ │ │ ├── AppDelegate.h │ │ ├── AppDelegate.m │ │ ├── DNSCrypt-Menubar-Info.plist │ │ ├── DNSCrypt-Menubar-Prefix.pch │ │ ├── en.lproj/ │ │ │ ├── InfoPlist.strings │ │ │ └── MainMenu.xib │ │ └── main.m │ ├── DNSCrypt-Menubar.xcodeproj/ │ │ ├── project.pbxproj │ │ └── project.xcworkspace/ │ │ └── contents.xcworkspacedata │ └── dnscrypt.icns ├── DNSCrypt-Meta-Installer/ │ ├── DNSCrypt-Meta-Installer.pkgproj │ └── install.sh ├── DNSCrypt-OSX-Installer/ │ ├── DNSCrypt-OSX-Installer.pkgproj │ ├── Scripts/ │ │ ├── dnscrypt-menubar-postinstall.sh │ │ ├── dnscrypt-menubar-preinstall.sh │ │ ├── dnscrypt-prefpane-postinstall.sh │ │ └── dnscrypt-prefpane-preinstall.sh │ ├── com.github.dnscrypt-osxclient.DNSCryptAfterboot.plist │ ├── com.github.dnscrypt-osxclient.DNSCryptConsoleChange.plist │ ├── com.github.dnscrypt-osxclient.DNSCryptControlChange.plist │ ├── com.github.dnscrypt-osxclient.DNSCryptMenuBar.plist │ ├── com.github.dnscrypt-osxclient.DNSCryptNetworkChange.plist │ └── sign.sh ├── DNSCrypt-Preference-Pane/ │ ├── COPYING │ ├── DNSCrypt/ │ │ ├── CHCSVParser/ │ │ │ ├── CHCSVParser.h │ │ │ └── CHCSVParser.m │ │ ├── DNSCrypt-Info.plist │ │ ├── DNSCrypt-Prefix.pch │ │ ├── DNSCrypt.h │ │ ├── DNSCrypt.m │ │ ├── DNSCrypt.tiff │ │ ├── en.lproj/ │ │ │ ├── DNSCrypt.xib │ │ │ └── InfoPlist.strings │ │ └── extra/ │ │ ├── html/ │ │ │ ├── about.haml │ │ │ ├── about.html │ │ │ ├── help.haml │ │ │ ├── help.html │ │ │ ├── releasenotes.haml │ │ │ └── releasenotes.html │ │ └── usr/ │ │ ├── bin/ │ │ │ └── Uninstall.app/ │ │ │ └── Contents/ │ │ │ ├── Info.plist │ │ │ ├── MacOS/ │ │ │ │ └── applet │ │ │ ├── PkgInfo │ │ │ └── Resources/ │ │ │ ├── Scripts/ │ │ │ │ └── main.scpt │ │ │ ├── applet.icns │ │ │ ├── applet.rsrc │ │ │ └── description.rtfd/ │ │ │ └── TXT.rtf │ │ └── scripts/ │ │ ├── afterboot.sh │ │ ├── check-hijacking.sh │ │ ├── check-local-dns.sh │ │ ├── check-network-change.sh │ │ ├── clear-fw.sh │ │ ├── common.inc │ │ ├── create-ticket.sh │ │ ├── exceptions-add.sh │ │ ├── exceptions-remove.sh │ │ ├── get-current-default-domain.sh │ │ ├── get-current-resolvers.sh │ │ ├── get-dhcp-resolvers.sh │ │ ├── get-dnscrypt-resolver-name.sh │ │ ├── get-dnscrypt-status.sh │ │ ├── get-fallback-status.sh │ │ ├── get-query-logging-status.sh │ │ ├── get-resolvers-description.sh │ │ ├── get-static-resolvers.sh │ │ ├── get-tickets-count.sh │ │ ├── get-upstream-resolvers.sh │ │ ├── gui-pop-conf-change.sh │ │ ├── gui-push-conf-change.sh │ │ ├── handle-console-change.sh │ │ ├── handle-control-change.sh │ │ ├── handle-network-change.sh │ │ ├── set-dns-to-dhcp.sh │ │ ├── set-dns.sh │ │ ├── set-dnscrypt-resolver-name.sh │ │ ├── set-static-resolvers.sh │ │ ├── start-dnscrypt-proxy.sh │ │ ├── stop-dnscrypt-proxy.sh │ │ ├── switch-blacklists-off.sh │ │ ├── switch-blacklists-on.sh │ │ ├── switch-fallback-off.sh │ │ ├── switch-fallback-on.sh │ │ ├── switch-query-logging-off.sh │ │ ├── switch-query-logging-on.sh │ │ ├── switch-to-dhcp-if-required.sh │ │ ├── switch-to-dhcp.sh │ │ ├── switch-to-dnscrypt-if-required.sh │ │ ├── switch-to-dnscrypt.sh │ │ ├── update-blacklist-domains.sh │ │ ├── update-blacklist-ips.sh │ │ └── update-exceptions.sh │ └── DNSCrypt.xcodeproj/ │ ├── project.pbxproj │ └── project.xcworkspace/ │ └── contents.xcworkspacedata ├── DNSCrypt-Uninstaller/ │ └── Uninstall.scpt ├── Pages/ │ ├── feedback.haml │ ├── feedback.php │ ├── feedback.tpl │ └── sent.haml └── README.markdown ================================================ FILE CONTENTS ================================================ ================================================ FILE: DNSCrypt-Menubar/COPYING ================================================ /* * Copyright (c) 2011-2014 OpenDNS, Inc. * Copyright (c) 2014 AlterStep * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ ================================================ FILE: DNSCrypt-Menubar/DNSCrypt-Menubar/AppDelegate.h ================================================ #import #define kDNSCRYPT_PREFPANE_APP_PATH @"/Library/PreferencePanes/DNSCrypt.prefPane" #define kDNSCRYPT_USR_BASE_DIR kDNSCRYPT_PREFPANE_APP_PATH @"/Contents/Resources/usr" #define kDNSCRIPT_SCRIPTS_BASE_DIR kDNSCRYPT_USR_BASE_DIR @"/scripts" #define kDNSCRYPT_VAR_BASE_DIR @"/Library/Application Support/DNSCrypt" #define kDNSCRYPT_CONTROL_DIR kDNSCRYPT_VAR_BASE_DIR @"/control" @interface AppDelegate : NSObject { NSWindow *_window; NSMenu *_dnscryptMenu; NSStatusItem *_statusItem; NSMenuItem *_versionMenuItem; NSMenuItem *_statusResolversMenuItem; NSMenuItem *_dnscryptMenuItem; } #define kREFRESH_DELAY 2.0 #define kCHECKBOXES_AFTER_CHANGE_DELAY 8.0 #define kMAX_TRIES_AFTER_CHANGE (30 / kREFRESH_DELAY) typedef enum { kDNS_CONFIGURATION_UNKNOWN, kDNS_CONFIGURATION_VANILLA, kDNS_CONFIGURATION_LOCALHOST } DNSConfigurationState; @property (strong) NSStatusItem *statusItem; @property (assign) NSWindow *window; @property (strong) IBOutlet NSMenu *dnscryptMenu; @property (strong) IBOutlet NSMenuItem *versionMenuItem; @property (strong) IBOutlet NSMenuItem *statusResolversMenuItem; @property (strong) IBOutlet NSMenuItem *dnscryptMenuItem; - (IBAction)preferencesMenuItemPushed:(NSMenuItem *)sender; - (IBAction)dnscryptMenuItemPushed:(NSMenuItem *)sender; @end ================================================ FILE: DNSCrypt-Menubar/DNSCrypt-Menubar/AppDelegate.m ================================================ #import "AppDelegate.h" @implementation AppDelegate @synthesize statusResolversMenuItem = _statusResolversMenuItem; @synthesize dnscryptMenuItem = _dnscryptMenuItem; @synthesize window = _window; @synthesize dnscryptMenu = _dnscryptMenu; @synthesize statusItem = _statusItem; @synthesize versionMenuItem = _versionMenuItem; DNSConfigurationState currentState = kDNS_CONFIGURATION_UNKNOWN; - (void) setCheckBoxesEnabled: (BOOL) enabled { [_dnscryptMenuItem setEnabled: enabled]; } - (NSString *) fromCommand: (NSString *) launchPath withArguments: (NSArray *) arguments { NSPipe *pipe = [NSPipe pipe]; NSTask *task = [[NSTask alloc] init]; NSData *data; NSString *result; task.launchPath = launchPath; task.arguments = arguments; task.standardOutput = pipe; [task launch]; data = [[pipe fileHandleForReading] readDataToEndOfFile]; [task waitUntilExit]; [task release]; result = [[[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding] autorelease]; if ([result hasSuffix: @"\n"]) { result = [result substringToIndex: result.length - 1]; } return result; } - (void) initState { NSString *res; _dnscryptMenuItem.state = 0; res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./get-dnscrypt-status.sh", nil]]; if ([res isEqualToString: @"yes"]) { [_dnscryptMenuItem setState: 1]; } } - (BOOL) resolversForService: (NSArray *) resolversForService includeResolvers:(NSArray *) resolvers { NSUInteger matches = 0U; for (NSString *resolverForService in resolversForService) { if ([resolvers containsObject: resolverForService]) { matches++; } else { break; } } if (matches >= resolvers.count) { return TRUE; } return FALSE; } - (void) updateLedStatus { NSImage *led = nil; switch (currentState) { case kDNS_CONFIGURATION_LOCALHOST: led = [NSImage imageNamed: @"icon-dnscrypt-active"]; break; case kDNS_CONFIGURATION_VANILLA: led = [NSImage imageNamed: @"icon-dnscrypt-inactive"]; break; default: led = [NSImage imageNamed: @"icon-no-network"]; } _statusItem.image = led; } - (BOOL) updateStatusWithCurrentConfig { NSString *stateDescription = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./get-current-resolvers.sh | ./get-resolvers-description.sh", nil]]; if ([stateDescription isEqualToString: @"DNSCrypt"]) { currentState = kDNS_CONFIGURATION_LOCALHOST; } else if ([stateDescription isEqualToString: @"None"]) { currentState = kDNS_CONFIGURATION_UNKNOWN; } else if ([stateDescription isEqualToString: @"Updating"]) { currentState = kDNS_CONFIGURATION_UNKNOWN; } else if (stateDescription.length > 0) { currentState = kDNS_CONFIGURATION_VANILLA; } [self updateLedStatus]; NSString *currentResolvers = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./get-current-resolvers.sh | ./get-upstream-resolvers.sh", nil]]; _statusResolversMenuItem.title = currentResolvers; NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./gui-pop-conf-change.sh menubar", nil]]; if ([res isEqualToString: @"yes"]) { [self initState]; } [self setCheckBoxesEnabled: TRUE]; return TRUE; } - (void) periodicallyUpdateStatusWithCurrentConfig { [self updateStatusWithCurrentConfig]; [NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector(periodicallyUpdateStatusWithCurrentConfig) object: nil]; [self performSelector: @selector(periodicallyUpdateStatusWithCurrentConfig) withObject:nil afterDelay: 5.0]; } - (void) waitForUpdate { NSString *res; static unsigned int tries; res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./get-tickets-count.sh", nil]]; if (res.length <= 0 || [res isEqualToString: @"0"] || tries > kMAX_TRIES_AFTER_CHANGE) { tries = 0U; [self periodicallyUpdateStatusWithCurrentConfig]; return; } tries++; [NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector(waitForUpdate) object: nil]; [self performSelector: @selector(waitForUpdate) withObject: self afterDelay:kREFRESH_DELAY]; } - (void) showSpinners { [self setCheckBoxesEnabled: FALSE]; NSImage *led = [NSImage imageNamed: @"icon-no-network"]; _statusItem.image = led; [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./gui-push-conf-change.sh prefpane", nil]]; [NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector(periodicallyUpdateStatusWithCurrentConfig) object: nil]; [NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector(waitForUpdate) object: nil]; [self performSelector: @selector(waitForUpdate) withObject: self afterDelay:kREFRESH_DELAY]; } - (void) awakeFromNib { _statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; [_statusItem retain]; _statusItem.highlightMode = TRUE; _statusItem.toolTip = @"DNSCrypt"; _statusItem.menu = _dnscryptMenu; NSString *versionStringFormat = NSLocalizedString(@"Client UI version: %@", @"Current UI version as shown in the menu"); NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; _versionMenuItem.title = [NSString stringWithFormat: versionStringFormat, version]; [self initState]; [self periodicallyUpdateStatusWithCurrentConfig]; [self updateLedStatus]; } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { } - (IBAction)preferencesMenuItemPushed:(NSMenuItem *)sender { NSString *userPreferencePanePath = [NSString stringWithFormat: @"%@" kDNSCRYPT_PREFPANE_APP_PATH, NSHomeDirectory()]; NSArray *preferencePanePaths = [NSArray arrayWithObjects: userPreferencePanePath, kDNSCRYPT_PREFPANE_APP_PATH, nil]; for (NSString *preferencePanePath in preferencePanePaths) { if ([[NSFileManager defaultManager] fileExistsAtPath: preferencePanePath]) { [[NSWorkspace sharedWorkspace] openFile: preferencePanePath]; return; } } } - (BOOL) setDNSCryptOn { [self showSpinners]; NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-to-dnscrypt.sh", nil]]; (void) res; return TRUE; } - (BOOL) setDNSCryptOff { [self showSpinners]; NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-to-dhcp.sh", nil]]; (void) res; return TRUE; } - (IBAction)dnscryptMenuItemPushed:(NSMenuItem *)sender { if (sender.state == 0) { sender.state = 1; [self setDNSCryptOn]; } else { sender.state = 0; [self setDNSCryptOff]; } } @end ================================================ FILE: DNSCrypt-Menubar/DNSCrypt-Menubar/DNSCrypt-Menubar-Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFile dnscrypt.icns CFBundleIdentifier com.github.dnscrypt-osxclient.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName DNSCrypt CFBundlePackageType APPL CFBundleShortVersionString 1.0.4 CFBundleSignature ???? CFBundleVersion 1.0.4 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} LSUIElement NSHumanReadableCopyright BSD NSMainNibFile MainMenu NSPrincipalClass NSApplication ================================================ FILE: DNSCrypt-Menubar/DNSCrypt-Menubar/DNSCrypt-Menubar-Prefix.pch ================================================ // // Prefix header for all source files of the 'DNSCrypt-Menubar' target in the 'DNSCrypt-Menubar' project // #ifdef __OBJC__ #import #endif ================================================ FILE: DNSCrypt-Menubar/DNSCrypt-Menubar/en.lproj/InfoPlist.strings ================================================ /* Localized versions of Info.plist keys */ ================================================ FILE: DNSCrypt-Menubar/DNSCrypt-Menubar/en.lproj/MainMenu.xib ================================================ ================================================ FILE: DNSCrypt-Menubar/DNSCrypt-Menubar/main.m ================================================ #import int main(int argc, char *argv[]) { nice(10); return NSApplicationMain(argc, (const char **)argv); } ================================================ FILE: DNSCrypt-Menubar/DNSCrypt-Menubar.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 09651148147D832D007FEE31 /* dnscrypt.icns in Resources */ = {isa = PBXBuildFile; fileRef = 09651147147D832D007FEE31 /* dnscrypt.icns */; }; 098E725E1905DF4C00C8CC6E /* icon-dnscrypt-active.png in Resources */ = {isa = PBXBuildFile; fileRef = 098E72581905DF4C00C8CC6E /* icon-dnscrypt-active.png */; }; 098E72601905DF4C00C8CC6E /* icon-dnscrypt-inactive.png in Resources */ = {isa = PBXBuildFile; fileRef = 098E725A1905DF4C00C8CC6E /* icon-dnscrypt-inactive.png */; }; 098E72621905DF4C00C8CC6E /* icon-no-network.png in Resources */ = {isa = PBXBuildFile; fileRef = 098E725C1905DF4C00C8CC6E /* icon-no-network.png */; }; 098E72671905E1A700C8CC6E /* icon-dnscrypt-active@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 098E72641905E1A700C8CC6E /* icon-dnscrypt-active@2x.png */; }; 098E72681905E1A700C8CC6E /* icon-dnscrypt-inactive@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 098E72651905E1A700C8CC6E /* icon-dnscrypt-inactive@2x.png */; }; 098E72691905E1A700C8CC6E /* icon-no-network@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 098E72661905E1A700C8CC6E /* icon-no-network@2x.png */; }; 09A13AD2145F3B9000B227A4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09A13AD1145F3B9000B227A4 /* Cocoa.framework */; }; 09A13ADC145F3B9000B227A4 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 09A13ADA145F3B9000B227A4 /* InfoPlist.strings */; }; 09A13ADE145F3B9000B227A4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 09A13ADD145F3B9000B227A4 /* main.m */; }; 09A13AE5145F3B9000B227A4 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 09A13AE4145F3B9000B227A4 /* AppDelegate.m */; }; 09A13AE8145F3B9000B227A4 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 09A13AE6145F3B9000B227A4 /* MainMenu.xib */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 0970EAA9160A5B0000865D5D /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 09651147147D832D007FEE31 /* dnscrypt.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = dnscrypt.icns; path = ../dnscrypt.icns; sourceTree = ""; }; 098E72581905DF4C00C8CC6E /* icon-dnscrypt-active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon-dnscrypt-active.png"; sourceTree = ""; }; 098E725A1905DF4C00C8CC6E /* icon-dnscrypt-inactive.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon-dnscrypt-inactive.png"; sourceTree = ""; }; 098E725C1905DF4C00C8CC6E /* icon-no-network.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon-no-network.png"; sourceTree = ""; }; 098E72641905E1A700C8CC6E /* icon-dnscrypt-active@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon-dnscrypt-active@2x.png"; sourceTree = ""; }; 098E72651905E1A700C8CC6E /* icon-dnscrypt-inactive@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon-dnscrypt-inactive@2x.png"; sourceTree = ""; }; 098E72661905E1A700C8CC6E /* icon-no-network@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon-no-network@2x.png"; sourceTree = ""; }; 09A13ACD145F3B9000B227A4 /* DNSCrypt Menubar.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DNSCrypt Menubar.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 09A13AD1145F3B9000B227A4 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 09A13AD4145F3B9000B227A4 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 09A13AD5145F3B9000B227A4 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 09A13AD6145F3B9000B227A4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 09A13AD9145F3B9000B227A4 /* DNSCrypt-Menubar-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "DNSCrypt-Menubar-Info.plist"; sourceTree = ""; }; 09A13ADB145F3B9000B227A4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 09A13ADD145F3B9000B227A4 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 09A13ADF145F3B9000B227A4 /* DNSCrypt-Menubar-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DNSCrypt-Menubar-Prefix.pch"; sourceTree = ""; }; 09A13AE3145F3B9000B227A4 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 09A13AE4145F3B9000B227A4 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 09A13AE7145F3B9000B227A4 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 09A13ACA145F3B9000B227A4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 09A13AD2145F3B9000B227A4 /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 09A13AC2145F3B9000B227A4 = { isa = PBXGroup; children = ( 09A13AD7145F3B9000B227A4 /* DNSCrypt-Menubar */, 09A13AD0145F3B9000B227A4 /* Frameworks */, 09A13ACE145F3B9000B227A4 /* Products */, ); sourceTree = ""; }; 09A13ACE145F3B9000B227A4 /* Products */ = { isa = PBXGroup; children = ( 09A13ACD145F3B9000B227A4 /* DNSCrypt Menubar.app */, ); name = Products; sourceTree = ""; }; 09A13AD0145F3B9000B227A4 /* Frameworks */ = { isa = PBXGroup; children = ( 09A13AD1145F3B9000B227A4 /* Cocoa.framework */, 09A13AD3145F3B9000B227A4 /* Other Frameworks */, ); name = Frameworks; sourceTree = ""; }; 09A13AD3145F3B9000B227A4 /* Other Frameworks */ = { isa = PBXGroup; children = ( 09A13AD4145F3B9000B227A4 /* AppKit.framework */, 09A13AD5145F3B9000B227A4 /* CoreData.framework */, 09A13AD6145F3B9000B227A4 /* Foundation.framework */, ); name = "Other Frameworks"; sourceTree = ""; }; 09A13AD7145F3B9000B227A4 /* DNSCrypt-Menubar */ = { isa = PBXGroup; children = ( 09A13AE3145F3B9000B227A4 /* AppDelegate.h */, 09A13AE4145F3B9000B227A4 /* AppDelegate.m */, 09A13AE6145F3B9000B227A4 /* MainMenu.xib */, 09A13AD8145F3B9000B227A4 /* Supporting Files */, ); path = "DNSCrypt-Menubar"; sourceTree = ""; }; 09A13AD8145F3B9000B227A4 /* Supporting Files */ = { isa = PBXGroup; children = ( 09651147147D832D007FEE31 /* dnscrypt.icns */, 09A13AD9145F3B9000B227A4 /* DNSCrypt-Menubar-Info.plist */, 09A13ADA145F3B9000B227A4 /* InfoPlist.strings */, 09A13ADD145F3B9000B227A4 /* main.m */, 09A13ADF145F3B9000B227A4 /* DNSCrypt-Menubar-Prefix.pch */, 098E72581905DF4C00C8CC6E /* icon-dnscrypt-active.png */, 098E725A1905DF4C00C8CC6E /* icon-dnscrypt-inactive.png */, 098E725C1905DF4C00C8CC6E /* icon-no-network.png */, 098E72641905E1A700C8CC6E /* icon-dnscrypt-active@2x.png */, 098E72651905E1A700C8CC6E /* icon-dnscrypt-inactive@2x.png */, 098E72661905E1A700C8CC6E /* icon-no-network@2x.png */, ); name = "Supporting Files"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 09A13ACC145F3B9000B227A4 /* DNSCrypt-Menubar */ = { isa = PBXNativeTarget; buildConfigurationList = 09A13AEB145F3B9000B227A4 /* Build configuration list for PBXNativeTarget "DNSCrypt-Menubar" */; buildPhases = ( 09A13AC9145F3B9000B227A4 /* Sources */, 09A13ACA145F3B9000B227A4 /* Frameworks */, 09A13ACB145F3B9000B227A4 /* Resources */, 0970EAA9160A5B0000865D5D /* CopyFiles */, ); buildRules = ( ); dependencies = ( ); name = "DNSCrypt-Menubar"; productName = "DNSCrypt-Menubar"; productReference = 09A13ACD145F3B9000B227A4 /* DNSCrypt Menubar.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 09A13AC4145F3B9000B227A4 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0510; }; buildConfigurationList = 09A13AC7145F3B9000B227A4 /* Build configuration list for PBXProject "DNSCrypt-Menubar" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = 09A13AC2145F3B9000B227A4; productRefGroup = 09A13ACE145F3B9000B227A4 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 09A13ACC145F3B9000B227A4 /* DNSCrypt-Menubar */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 09A13ACB145F3B9000B227A4 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 098E72681905E1A700C8CC6E /* icon-dnscrypt-inactive@2x.png in Resources */, 09A13ADC145F3B9000B227A4 /* InfoPlist.strings in Resources */, 098E725E1905DF4C00C8CC6E /* icon-dnscrypt-active.png in Resources */, 09A13AE8145F3B9000B227A4 /* MainMenu.xib in Resources */, 098E72691905E1A700C8CC6E /* icon-no-network@2x.png in Resources */, 098E72601905DF4C00C8CC6E /* icon-dnscrypt-inactive.png in Resources */, 098E72621905DF4C00C8CC6E /* icon-no-network.png in Resources */, 098E72671905E1A700C8CC6E /* icon-dnscrypt-active@2x.png in Resources */, 09651148147D832D007FEE31 /* dnscrypt.icns in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 09A13AC9145F3B9000B227A4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 09A13ADE145F3B9000B227A4 /* main.m in Sources */, 09A13AE5145F3B9000B227A4 /* AppDelegate.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 09A13ADA145F3B9000B227A4 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 09A13ADB145F3B9000B227A4 /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; 09A13AE6145F3B9000B227A4 /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( 09A13AE7145F3B9000B227A4 /* en */, ); name = MainMenu.xib; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 09A13AE9145F3B9000B227A4 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_ENABLE_OBJC_ARC = NO; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.6; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; name = Debug; }; 09A13AEA145F3B9000B227A4 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_ENABLE_OBJC_ARC = NO; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.6; SDKROOT = macosx; }; name = Release; }; 09A13AEC145F3B9000B227A4 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)\"", "\"$(SRCROOT)/../../../../../Library/Developer/Xcode/DerivedData/Sparkle-evkudstnytcsfdeunmxihhpyexor/Build/Products/Release\"", ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "DNSCrypt-Menubar/DNSCrypt-Menubar-Prefix.pch"; INFOPLIST_FILE = "DNSCrypt-Menubar/DNSCrypt-Menubar-Info.plist"; MACOSX_DEPLOYMENT_TARGET = 10.8; PRODUCT_NAME = "DNSCrypt Menubar"; WRAPPER_EXTENSION = app; }; name = Debug; }; 09A13AED145F3B9000B227A4 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)\"", "\"$(SRCROOT)/../../../../../Library/Developer/Xcode/DerivedData/Sparkle-evkudstnytcsfdeunmxihhpyexor/Build/Products/Release\"", ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "DNSCrypt-Menubar/DNSCrypt-Menubar-Prefix.pch"; INFOPLIST_FILE = "DNSCrypt-Menubar/DNSCrypt-Menubar-Info.plist"; MACOSX_DEPLOYMENT_TARGET = 10.8; PRODUCT_NAME = "DNSCrypt Menubar"; WRAPPER_EXTENSION = app; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 09A13AC7145F3B9000B227A4 /* Build configuration list for PBXProject "DNSCrypt-Menubar" */ = { isa = XCConfigurationList; buildConfigurations = ( 09A13AE9145F3B9000B227A4 /* Debug */, 09A13AEA145F3B9000B227A4 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 09A13AEB145F3B9000B227A4 /* Build configuration list for PBXNativeTarget "DNSCrypt-Menubar" */ = { isa = XCConfigurationList; buildConfigurations = ( 09A13AEC145F3B9000B227A4 /* Debug */, 09A13AED145F3B9000B227A4 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 09A13AC4145F3B9000B227A4 /* Project object */; } ================================================ FILE: DNSCrypt-Menubar/DNSCrypt-Menubar.xcodeproj/project.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: DNSCrypt-Meta-Installer/DNSCrypt-Meta-Installer.pkgproj ================================================ PROJECT PACKAGE_FILES DEFAULT_INSTALL_LOCATION / HIERARCHY CHILDREN CHILDREN CHILDREN GID 80 PATH Utilities PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 80 PATH Applications PATH_TYPE 0 PERMISSIONS 509 TYPE 1 UID 0 CHILDREN CHILDREN GID 80 PATH Application Support PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Documentation PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Filesystems PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Frameworks PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Internet Plug-Ins PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH LaunchAgents PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH LaunchDaemons PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH PreferencePanes PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Preferences PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 80 PATH Printers PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH PrivilegedHelperTools PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH QuickTime PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Screen Savers PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Scripts PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Services PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Widgets PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH Library PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN CHILDREN CHILDREN GID 0 PATH Extensions PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH Library PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH System PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN CHILDREN GID 0 PATH Shared PATH_TYPE 0 PERMISSIONS 1023 TYPE 1 UID 0 GID 80 PATH Users PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH / PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 PAYLOAD_TYPE 0 VERSION 2 PACKAGE_SCRIPTS PREINSTALL_PATH PATH install.sh PATH_TYPE 3 RESOURCES CHILDREN GID 0 PATH pkg.tgz PATH_TYPE 1 PERMISSIONS 420 TYPE 3 UID 0 PACKAGE_SETTINGS AUTHENTICATION CONCLUSION_ACTION 0 IDENTIFIER osx.org.pureftpd.pkg.DNSCrypt-Meta-Installer OVERWRITE_PERMISSIONS VERSION 0.19 PROJECT_COMMENTS NOTES PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1M IDQuMDEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQv c3RyaWN0LmR0ZCI+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1l cXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7 IGNoYXJzZXQ9VVRGLTgiPgo8bWV0YSBodHRwLWVxdWl2PSJDb250 ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIj4KPHRp dGxlPjwvdGl0bGU+CjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29u dGVudD0iQ29jb2EgSFRNTCBXcml0ZXIiPgo8bWV0YSBuYW1lPSJD b2NvYVZlcnNpb24iIGNvbnRlbnQ9IjExODcuMzQiPgo8c3R5bGUg dHlwZT0idGV4dC9jc3MiPgo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5 Pgo8L2JvZHk+CjwvaHRtbD4K PROJECT_SETTINGS BUILD_PATH PATH build PATH_TYPE 1 EXCLUDED_FILES PATTERNS_ARRAY REGULAR_EXPRESSION STRING .DS_Store TYPE 0 PROTECTED PROXY_NAME Remove .DS_Store files PROXY_TOOLTIP Remove ".DS_Store" files created by the Finder. STATE PATTERNS_ARRAY REGULAR_EXPRESSION STRING .pbdevelopment TYPE 0 PROTECTED PROXY_NAME Remove .pbdevelopment files PROXY_TOOLTIP Remove ".pbdevelopment" files created by ProjectBuilder or Xcode. STATE PATTERNS_ARRAY REGULAR_EXPRESSION STRING CVS TYPE 1 REGULAR_EXPRESSION STRING .cvsignore TYPE 0 REGULAR_EXPRESSION STRING .cvspass TYPE 0 REGULAR_EXPRESSION STRING .svn TYPE 1 PROTECTED PROXY_NAME Remove SCM metadata PROXY_TOOLTIP Remove helper files and folders used by the CVS and SVN Source Code Management systems. STATE PATTERNS_ARRAY REGULAR_EXPRESSION STRING classes.nib TYPE 0 REGULAR_EXPRESSION STRING designable.db TYPE 0 REGULAR_EXPRESSION STRING info.nib TYPE 0 PROTECTED PROXY_NAME Optimize nib files PROXY_TOOLTIP Remove "classes.nib", "info.nib" and "designable.nib" files within .nib bundles. STATE PATTERNS_ARRAY REGULAR_EXPRESSION STRING Resources Disabled TYPE 1 PROTECTED PROXY_NAME Remove Resources Disabled folders PROXY_TOOLTIP Remove "Resources Disabled" folders. STATE SEPARATOR NAME DNSCrypt TYPE 1 VERSION 2 ================================================ FILE: DNSCrypt-Meta-Installer/install.sh ================================================ #! /bin/sh env > /tmp/a tdir=$(mktemp -d /tmp/XXXXXXXXXXXXXXXX) chmod 755 "$tdir" tar x -z -C "$tdir" -f pkg.tgz (sleep 10 ; cd "$tdir" ; exec open -W -b 'com.apple.installer' ./DNSCrypt.mpkg) & ================================================ FILE: DNSCrypt-OSX-Installer/DNSCrypt-OSX-Installer.pkgproj ================================================ PACKAGES PACKAGE_FILES DEFAULT_INSTALL_LOCATION / HIERARCHY CHILDREN CHILDREN CHILDREN GID 80 PATH Utilities PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 80 PATH Applications PATH_TYPE 0 PERMISSIONS 509 TYPE 1 UID 0 CHILDREN CHILDREN GID 80 PATH Application Support PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Documentation PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Filesystems PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Frameworks PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Internet Plug-Ins PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH LaunchAgents PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH LaunchDaemons PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH PreferencePanes PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Preferences PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 80 PATH Printers PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH PrivilegedHelperTools PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH QuickTime PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Screen Savers PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Scripts PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Services PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Widgets PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH Library PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN CHILDREN CHILDREN GID 0 PATH Extensions PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH Library PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH System PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN CHILDREN GID 0 PATH Shared PATH_TYPE 0 PERMISSIONS 1023 TYPE 1 UID 0 GID 80 PATH Users PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN CHILDREN CHILDREN CHILDREN GID 0 PATH /usr/local/bin/hostip PATH_TYPE 0 PERMISSIONS 493 TYPE 3 UID 0 GID 0 PATH bin PATH_TYPE 0 PERMISSIONS 493 TYPE 2 UID 0 CHILDREN CHILDREN CHILDREN GID 0 PATH /usr/local/lib/dnscrypt-proxy/libdcplugin_example_ldns_aaaa_blocking.la PATH_TYPE 0 PERMISSIONS 493 TYPE 3 UID 0 CHILDREN GID 0 PATH /usr/local/lib/dnscrypt-proxy/libdcplugin_example_ldns_aaaa_blocking.so PATH_TYPE 0 PERMISSIONS 493 TYPE 3 UID 0 CHILDREN GID 0 PATH /usr/local/lib/dnscrypt-proxy/libdcplugin_example_ldns_blocking.la PATH_TYPE 0 PERMISSIONS 493 TYPE 3 UID 0 CHILDREN GID 0 PATH /usr/local/lib/dnscrypt-proxy/libdcplugin_example_ldns_blocking.so PATH_TYPE 0 PERMISSIONS 493 TYPE 3 UID 0 CHILDREN GID 0 PATH /usr/local/lib/dnscrypt-proxy/libdcplugin_example_ldns_opendns_deviceid.la PATH_TYPE 0 PERMISSIONS 493 TYPE 3 UID 0 CHILDREN GID 0 PATH /usr/local/lib/dnscrypt-proxy/libdcplugin_example_ldns_opendns_deviceid.so PATH_TYPE 0 PERMISSIONS 493 TYPE 3 UID 0 CHILDREN GID 0 PATH /usr/local/lib/dnscrypt-proxy/libdcplugin_example_logging.la PATH_TYPE 0 PERMISSIONS 493 TYPE 3 UID 0 CHILDREN GID 0 PATH /usr/local/lib/dnscrypt-proxy/libdcplugin_example_logging.so PATH_TYPE 0 PERMISSIONS 493 TYPE 3 UID 0 GID 0 PATH dnscrypt-proxy PATH_TYPE 0 PERMISSIONS 493 TYPE 2 UID 0 GID 0 PATH lib PATH_TYPE 0 PERMISSIONS 493 TYPE 2 UID 0 CHILDREN CHILDREN GID 0 PATH /usr/local/sbin/dnscrypt-proxy PATH_TYPE 0 PERMISSIONS 493 TYPE 3 UID 0 GID 0 PATH sbin PATH_TYPE 0 PERMISSIONS 493 TYPE 2 UID 0 CHILDREN CHILDREN CHILDREN GID 0 PATH /usr/local/share/dnscrypt-proxy/dnscrypt-resolvers.csv PATH_TYPE 0 PERMISSIONS 420 TYPE 3 UID 0 GID 0 PATH dnscrypt-proxy PATH_TYPE 0 PERMISSIONS 493 TYPE 2 UID 0 CHILDREN CHILDREN CHILDREN GID 0 PATH /usr/local/share/man/man8/dnscrypt-proxy.8 PATH_TYPE 0 PERMISSIONS 420 TYPE 3 UID 0 CHILDREN GID 0 PATH /usr/local/share/man/man8/hostip.8 PATH_TYPE 0 PERMISSIONS 420 TYPE 3 UID 0 GID 0 PATH man8 PATH_TYPE 0 PERMISSIONS 493 TYPE 2 UID 0 GID 0 PATH man PATH_TYPE 0 PERMISSIONS 493 TYPE 2 UID 0 GID 0 PATH share PATH_TYPE 0 PERMISSIONS 493 TYPE 2 UID 0 GID 0 PATH local PATH_TYPE 0 PERMISSIONS 493 TYPE 2 UID 0 GID 0 PATH usr PATH_TYPE 0 PERMISSIONS 493 TYPE 2 UID 0 GID 0 PATH / PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 PAYLOAD_TYPE 0 VERSION 2 PACKAGE_SCRIPTS POSTINSTALL_PATH PREINSTALL_PATH RESOURCES PACKAGE_SETTINGS AUTHENTICATION 1 CONCLUSION_ACTION 0 IDENTIFIER com.github.dnscrypt-osxclient.dnscryptClient.dnscrypt-proxy LOCATION 0 NAME DNSCrypt Proxy OVERWRITE_PERMISSIONS REFERENCE_PATH / RELOCATABLE USE_HFS+_COMPRESSION VERSION 1.4.1 UUID 7F7D70AB-F7A2-4027-8304-3063C7B9532F PACKAGE_FILES DEFAULT_INSTALL_LOCATION / HIERARCHY CHILDREN CHILDREN CHILDREN GID 80 PATH Utilities PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 80 PATH Applications PATH_TYPE 0 PERMISSIONS 509 TYPE 1 UID 0 CHILDREN CHILDREN GID 80 PATH Application Support PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Documentation PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Filesystems PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Frameworks PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Internet Plug-Ins PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH LaunchAgents PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN CHILDREN GID 0 PATH /Users/j/OpenDNS/DNSCrypt/OSX/dnscrypt-osx-client/DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptAfterboot.plist PATH_TYPE 0 PERMISSIONS 420 TYPE 3 UID 0 CHILDREN GID 0 PATH /Users/j/OpenDNS/DNSCrypt/OSX/dnscrypt-osx-client/DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptConsoleChange.plist PATH_TYPE 0 PERMISSIONS 420 TYPE 3 UID 0 CHILDREN GID 0 PATH /Users/j/OpenDNS/DNSCrypt/OSX/dnscrypt-osx-client/DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptControlChange.plist PATH_TYPE 0 PERMISSIONS 420 TYPE 3 UID 0 CHILDREN GID 0 PATH /Users/j/OpenDNS/DNSCrypt/OSX/dnscrypt-osx-client/DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptNetworkChange.plist PATH_TYPE 0 PERMISSIONS 420 TYPE 3 UID 0 GID 0 PATH LaunchDaemons PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN CHILDREN GID 0 PATH /Users/j/Library/Developer/Xcode/DerivedData/DNSCrypt-fxkuknmyuyumstcqfthykzrsdius/Build/Products/Release/DNSCrypt.prefPane PATH_TYPE 0 PERMISSIONS 493 TYPE 3 UID 0 GID 0 PATH PreferencePanes PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Preferences PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 80 PATH Printers PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH PrivilegedHelperTools PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH QuickTime PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Screen Savers PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Scripts PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Services PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Widgets PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH Library PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN CHILDREN CHILDREN GID 0 PATH Extensions PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH Library PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH System PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN CHILDREN GID 0 PATH Shared PATH_TYPE 0 PERMISSIONS 1023 TYPE 1 UID 0 GID 80 PATH Users PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN CHILDREN CHILDREN CHILDREN GID 0 PATH /usr/local/bin/alarmer PATH_TYPE 0 PERMISSIONS 493 TYPE 3 UID 0 GID 0 PATH bin PATH_TYPE 0 PERMISSIONS 493 TYPE 2 UID 0 GID 0 PATH local PATH_TYPE 0 PERMISSIONS 493 TYPE 2 UID 0 GID 0 PATH usr PATH_TYPE 0 PERMISSIONS 493 TYPE 2 UID 0 GID 0 PATH / PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 PAYLOAD_TYPE 0 VERSION 2 PACKAGE_SCRIPTS POSTINSTALL_PATH PATH /Users/j/OpenDNS/DNSCrypt/OSX/dnscrypt-osx-client/DNSCrypt-OSX-Installer/Scripts/dnscrypt-prefpane-postinstall.sh PATH_TYPE 0 PREINSTALL_PATH PATH /Users/j/OpenDNS/DNSCrypt/OSX/dnscrypt-osx-client/DNSCrypt-OSX-Installer/Scripts/dnscrypt-prefpane-preinstall.sh PATH_TYPE 0 RESOURCES PACKAGE_SETTINGS AUTHENTICATION 1 CONCLUSION_ACTION 2 IDENTIFIER com.github.dnscrypt-osxclient.dnscryptClient.DNSCrypt LOCATION 0 NAME DNSCrypt Preference Pane OVERWRITE_PERMISSIONS USE_HFS+_COMPRESSION VERSION 1.0.4 TYPE 0 UUID 6FEDF493-DE5C-4438-B4BC-5B5AFCFBB3E6 PACKAGE_FILES DEFAULT_INSTALL_LOCATION / HIERARCHY CHILDREN CHILDREN CHILDREN GID 80 PATH /Users/j/Library/Developer/Xcode/DerivedData/DNSCrypt-Menubar-fcseadxtcidaaddjtyicaarzthfd/Build/Products/Release/DNSCrypt Menubar.app PATH_TYPE 0 PERMISSIONS 493 TYPE 3 UID 0 CHILDREN GID 80 PATH Utilities PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 80 PATH Applications PATH_TYPE 0 PERMISSIONS 509 TYPE 1 UID 0 CHILDREN CHILDREN GID 80 PATH Application Support PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Documentation PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Filesystems PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Frameworks PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Internet Plug-Ins PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN CHILDREN GID 0 PATH com.github.dnscrypt-osxclient.DNSCryptMenuBar.plist PATH_TYPE 1 PERMISSIONS 420 TYPE 3 UID 0 GID 0 PATH LaunchAgents PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH LaunchDaemons PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH PreferencePanes PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Preferences PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 80 PATH Printers PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH PrivilegedHelperTools PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH QuickTime PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Screen Savers PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Scripts PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Services PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Widgets PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH Library PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN CHILDREN CHILDREN GID 0 PATH Extensions PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH Library PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH System PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN CHILDREN GID 0 PATH Shared PATH_TYPE 0 PERMISSIONS 1023 TYPE 1 UID 0 GID 80 PATH Users PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH / PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 PAYLOAD_TYPE 0 VERSION 2 PACKAGE_SCRIPTS POSTINSTALL_PATH PATH /Users/j/OpenDNS/DNSCrypt/OSX/dnscrypt-osx-client/DNSCrypt-OSX-Installer/Scripts/dnscrypt-menubar-postinstall.sh PATH_TYPE 0 PREINSTALL_PATH PATH /Users/j/OpenDNS/DNSCrypt/OSX/dnscrypt-osx-client/DNSCrypt-OSX-Installer/Scripts/dnscrypt-menubar-preinstall.sh PATH_TYPE 0 RESOURCES PACKAGE_SETTINGS AUTHENTICATION 1 CONCLUSION_ACTION 2 IDENTIFIER com.github.dnscrypt-osxclient.dnscryptClient.DNSCrypt-Menubar LOCATION 0 NAME DNSCrypt Menu bar OVERWRITE_PERMISSIONS USE_HFS+_COMPRESSION VERSION 1.0.4 TYPE 0 UUID E69268A3-3CD1-49FF-8B46-4D45A963F8FA PROJECT PROJECT_COMMENTS NOTES PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1M IDQuMDEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQv c3RyaWN0LmR0ZCI+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1l cXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7 IGNoYXJzZXQ9VVRGLTgiPgo8bWV0YSBodHRwLWVxdWl2PSJDb250 ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIj4KPHRp dGxlPjwvdGl0bGU+CjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29u dGVudD0iQ29jb2EgSFRNTCBXcml0ZXIiPgo8bWV0YSBuYW1lPSJD b2NvYVZlcnNpb24iIGNvbnRlbnQ9IjEyNjUuMiI+CjxzdHlsZSB0 eXBlPSJ0ZXh0L2NzcyI+Cjwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ CjwvYm9keT4KPC9odG1sPgo= PROJECT_PRESENTATION BACKGROUND ALIGNMENT 0 BACKGROUND_PATH PATH installed_background.gif PATH_TYPE 1 CUSTOM 0 SCALING 1 INSTALLATION TYPE HIERARCHIES INSTALLER LIST DESCRIPTION OPTIONS HIDDEN STATE 1 PACKAGE_UUID 7F7D70AB-F7A2-4027-8304-3063C7B9532F REQUIREMENTS TITLE TOOLTIP TYPE 0 UUID FE4B2779-1476-4341-A773-534E27377369 DESCRIPTION OPTIONS HIDDEN STATE 1 PACKAGE_UUID 6FEDF493-DE5C-4438-B4BC-5B5AFCFBB3E6 TITLE TOOLTIP TYPE 0 UUID 7D8D1323-66FB-4A66-AB2A-CF2276924169 DESCRIPTION OPTIONS HIDDEN STATE 1 PACKAGE_UUID E69268A3-3CD1-49FF-8B46-4D45A963F8FA TITLE TOOLTIP TYPE 0 UUID 979F40E5-BFE3-438D-BAC3-A1D17BEFE932 REMOVED INSTALLATION TYPE 0 MODE 1 INSTALLATION_STEPS ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewIntroductionController INSTALLER_PLUGIN Introduction LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewReadMeController INSTALLER_PLUGIN ReadMe LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewLicenseController INSTALLER_PLUGIN License LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewDestinationSelectController INSTALLER_PLUGIN TargetSelect LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewInstallationTypeController INSTALLER_PLUGIN PackageSelection LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewInstallationController INSTALLER_PLUGIN Install LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewSummaryController INSTALLER_PLUGIN Summary LIST_TITLE_KEY InstallerSectionTitle INTRODUCTION LOCALIZATIONS LICENSE KEYWORDS LOCALIZATIONS MODE 0 README LOCALIZATIONS SUMMARY LOCALIZATIONS TITLE LOCALIZATIONS LANGUAGE English VALUE DNSCrypt OSX Client PROJECT_REQUIREMENTS LIST BEHAVIOR 3 DICTIONARY IC_REQUIREMENT_CPU_ARCHITECTURE_FAMILY 2 IC_REQUIREMENT_CPU_INTEL_ARCHITECTURE_TYPE 0 IC_REQUIREMENT_CPU_MINIMUM_CPU_CORES_COUNT 1 IC_REQUIREMENT_CPU_MINIMUM_FREQUENCY 866666 IC_REQUIREMENT_CPU_POWERPC_ARCHITECTURE_TYPE 0 IC_REQUIREMENT_CHECK_TYPE 0 IDENTIFIER fr.whitebox.Packages.requirement.cpu MESSAGE LANGUAGE English SECONDARY_VALUE VALUE The DNSCrypt GUI for Mac currently requires at least an Intel Core CPU. NAME Processor STATE BEHAVIOR 3 DICTIONARY IC_REQUIREMENT_OS_DISK_TYPE 0 IC_REQUIREMENT_OS_DISTRIBUTION_TYPE 1 IC_REQUIREMENT_OS_MINIMUM_VERSION 100800 IC_REQUIREMENT_CHECK_TYPE 1 IDENTIFIER fr.whitebox.Packages.requirement.os MESSAGE LANGUAGE English VALUE This user interface doesn't work with this version of OSX. NAME Operating System STATE POSTINSTALL_PATH PREINSTALL_PATH RESOURCES ROOT_VOLUME_ONLY PROJECT_SETTINGS ADVANCED_OPTIONS BUILD_FORMAT 1 BUILD_PATH PATH build PATH_TYPE 1 EXCLUDED_FILES PATTERNS_ARRAY REGULAR_EXPRESSION STRING .DS_Store TYPE 0 PROTECTED PROXY_NAME Remove .DS_Store files PROXY_TOOLTIP Remove ".DS_Store" files created by the Finder. STATE PATTERNS_ARRAY REGULAR_EXPRESSION STRING .pbdevelopment TYPE 0 PROTECTED PROXY_NAME Remove .pbdevelopment files PROXY_TOOLTIP Remove ".pbdevelopment" files created by ProjectBuilder or Xcode. STATE PATTERNS_ARRAY REGULAR_EXPRESSION STRING CVS TYPE 1 REGULAR_EXPRESSION STRING .cvsignore TYPE 0 REGULAR_EXPRESSION STRING .cvspass TYPE 0 REGULAR_EXPRESSION STRING .svn TYPE 1 PROTECTED PROXY_NAME Remove SCM metadata PROXY_TOOLTIP Remove helper files and folders used by the CVS and SVN Source Code Management systems. STATE PATTERNS_ARRAY REGULAR_EXPRESSION STRING classes.nib TYPE 0 REGULAR_EXPRESSION STRING designable.db TYPE 0 REGULAR_EXPRESSION STRING info.nib TYPE 0 PROTECTED PROXY_NAME Optimize nib files PROXY_TOOLTIP Remove "classes.nib", "info.nib" and "designable.nib" files within .nib bundles. STATE PATTERNS_ARRAY REGULAR_EXPRESSION STRING Resources Disabled TYPE 1 PROTECTED PROXY_NAME Remove Resources Disabled folders PROXY_TOOLTIP Remove "Resources Disabled" folders. STATE SEPARATOR NAME DNSCrypt TYPE 0 VERSION 2 ================================================ FILE: DNSCrypt-OSX-Installer/Scripts/dnscrypt-menubar-postinstall.sh ================================================ #! /bin/sh exec 2>/dev/null /bin/launchctl load \ '/Library/LaunchAgents/com.github.dnscrypt-osxclient.DNSCryptMenuBar.plist' /bin/launchctl start com.github.dnscrypt-osxclient.DNSCryptMenuBar exit 0 ================================================ FILE: DNSCrypt-OSX-Installer/Scripts/dnscrypt-menubar-preinstall.sh ================================================ #! /bin/sh exec 2>/dev/null /bin/launchctl stop com.opendns.osx.RoamingClientMenubar /bin/launchctl remove com.opendns.osx.RoamingClientMenubar /bin/launchctl stop com.opendns.osx.RoamingClientConfigUpdater /bin/launchctl remove com.opendns.osx.RoamingClientConfigUpdater /bin/rm -f /Library/LaunchDaemons/com.opendns.osx.Roaming*.plist /bin/launchctl stop com.opendns.osx.DNSCryptMenuBar /bin/launchctl remove com.opendns.osx.DNSCryptMenuBar /bin/launchctl stop com.github.dnscrypt-osxclient.DNSCryptMenuBar /bin/launchctl remove com.github.dnscrypt-osxclient.DNSCryptMenuBar killall 'DNSCrypt-Menubar' killall 'DNSCrypt Menubar' /bin/rm -f /Library/LaunchDaemons/com.opendns.osx.DNSCryptMenuBar.plist /bin/rm -f /Library/LaunchDaemons/com.github.dnscrypt-osxclient.DNSCryptMenuBar.plist exit 0 ================================================ FILE: DNSCrypt-OSX-Installer/Scripts/dnscrypt-prefpane-postinstall.sh ================================================ #! /bin/sh exec 2>/dev/null /bin/mkdir -p '/Library/Application Support/DNSCrypt/control' /bin/mkdir -p '/Library/Application Support/DNSCrypt/dnscrypt-proxy' /bin/mkdir -p '/Library/Application Support/DNSCrypt/probes' /bin/mkdir -p '/Library/Application Support/DNSCrypt/states' /bin/mkdir -p '/Library/Application Support/DNSCrypt/tickets' /bin/chmod 755 '/Library/Application Support/DNSCrypt' /bin/chmod 755 '/usr/local/bin/hostip' /bin/chmod 755 '/usr/local/sbin/dnscrypt-proxy' /bin/chmod -R 755 '/usr/local/lib/dnscrypt-proxy' /usr/sbin/chown -R 0:0 '/Library/Application Support/DNSCrypt' /usr/sbin/chown 0:0 '/usr/local/bin/hostip' /usr/sbin/chown 0:0 '/usr/local/lib/dnscrypt-proxy' /usr/sbin/chown -R 0:0 '/usr/local/sbin/dnscrypt-proxy' eval $(/usr/bin/stat -s '/dev/console') if [ $? != 0 ]; then wanted_uid="$st_uid" /usr/sbin/chown -R "${wanted_uid}:0" \ '/Library/Application Support/DNSCrypt/control' /usr/sbin/chown -R "${wanted_uid}:0" \ '/Library/Application Support/DNSCrypt/tickets' fi rm -f '/Library/Application Support/DNSCrypt/control/plugin-parental-controls.enabled' rm -f '/Library/Application Support/DNSCrypt/control/plugin-lockin.enabled' for service in com.github.dnscrypt-osxclient.DNSCryptAfterboot \ com.github.dnscrypt-osxclient.DNSCryptConsoleChange \ com.github.dnscrypt-osxclient.DNSCryptControlChange \ com.github.dnscrypt-osxclient.DNSCryptNetworkChange; do /bin/launchctl load "/Library/LaunchDaemons/${service}.plist" /bin/launchctl start "$service" done /usr/bin/touch '/Library/Application Support/DNSCrypt/control' exit 0 ================================================ FILE: DNSCrypt-OSX-Installer/Scripts/dnscrypt-prefpane-preinstall.sh ================================================ #! /bin/sh exec 2>/dev/null killall 'System Preferences' /bin/rm -rf '/Library/Application Support/DNSCrypt Updater' /bin/launchctl stop com.opendns.osx.DNSCryptConfigUpdater /bin/launchctl remove com.opendns.osx.DNSCryptConfigUpdater /bin/rm -f '/Library/LaunchDaemons/com.opendns.osx.DNSCryptConfigUpdater.plist' /bin/launchctl stop com.github.dnscrypt-osxclient.DNSCryptConfigUpdater /bin/launchctl remove com.github.dnscrypt-osxclient.DNSCryptConfigUpdater /bin/rm -f '/Library/LaunchDaemons/com.github.dnscrypt-osxclient.DNSCryptConfigUpdater.plist' /bin/launchctl stop com.opendns.osx.DNSCryptAfterboot /bin/launchctl remove com.opendns.osx.DNSCryptAfterboot /bin/launchctl stop com.opendns.osx.DNSCryptConsoleChange /bin/launchctl remove com.opendns.osx.DNSCryptConsoleChange /bin/launchctl stop com.opendns.osx.DNSCryptControlChange /bin/launchctl remove com.opendns.osx.DNSCryptControlChange /bin/launchctl stop com.opendns.osx.DNSCryptNetworkChange /bin/launchctl remove com.opendns.osx.DNSCryptNetworkChange /bin/rm -f /Library/LaunchDaemons/com.opendns.osx.DNSCryptAfterboot.plist /bin/rm -f /Library/LaunchDaemons/com.opendns.osx.DNSCryptConsoleChange.plist /bin/rm -f /Library/LaunchDaemons/com.opendns.osx.DNSCryptControlChange.plist /bin/rm -f /Library/LaunchDaemons/com.opendns.osx.DNSCryptNetworkChange.plist /bin/launchctl stop com.github.dnscrypt-osxclient.DNSCryptAfterboot /bin/launchctl remove com.github.dnscrypt-osxclient.DNSCryptAfterboot /bin/launchctl stop com.github.dnscrypt-osxclient.DNSCryptConsoleChange /bin/launchctl remove com.github.dnscrypt-osxclient.DNSCryptConsoleChange /bin/launchctl stop com.github.dnscrypt-osxclient.DNSCryptControlChange /bin/launchctl remove com.github.dnscrypt-osxclient.DNSCryptControlChange /bin/launchctl stop com.github.dnscrypt-osxclient.DNSCryptNetworkChange /bin/launchctl remove com.github.dnscrypt-osxclient.DNSCryptNetworkChange /bin/rm -f /Library/LaunchDaemons/com.github.dnscrypt-osxclient.DNSCryptAfterboot.plist /bin/rm -f /Library/LaunchDaemons/com.github.dnscrypt-osxclient.DNSCryptConsoleChange.plist /bin/rm -f /Library/LaunchDaemons/com.github.dnscrypt-osxclient.DNSCryptControlChange.plist /bin/rm -f /Library/LaunchDaemons/com.github.dnscrypt-osxclient.DNSCryptNetworkChange.plist /bin/rm -f /var/run/dnscrypt*.lock exit 0 ================================================ FILE: DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptAfterboot.plist ================================================ Label com.github.dnscrypt-osxclient.DNSCryptAfterboot KeepAlive RunAtLoad WorkingDirectory /Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/scripts ProgramArguments /Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/scripts/afterboot.sh ExitTimeOut 300 ThrottleInterval 1 Nice 1 UserName root ================================================ FILE: DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptConsoleChange.plist ================================================ Label com.github.dnscrypt-osxclient.DNSCryptConsoleChange KeepAlive RunAtLoad WorkingDirectory /Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/scripts ProgramArguments /Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/scripts/handle-console-change.sh ExitTimeOut 30 ThrottleInterval 0 Nice 15 UserName root WatchPaths /dev/console /var/run/utmpx ================================================ FILE: DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptControlChange.plist ================================================ Label com.github.dnscrypt-osxclient.DNSCryptControlChange KeepAlive RunAtLoad WorkingDirectory /Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/scripts ProgramArguments /Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/scripts/handle-control-change.sh ExitTimeOut 300 ThrottleInterval 0 Nice 1 UserName root WatchPaths /Library/Application Support/DNSCrypt/control ================================================ FILE: DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptMenuBar.plist ================================================ Label com.github.dnscrypt-osxclient.DNSCryptMenuBar KeepAlive RunAtLoad ProgramArguments /Applications/DNSCrypt Menubar.app/Contents/MacOS/DNSCrypt Menubar LimitLoadToSessionType Aqua ================================================ FILE: DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptNetworkChange.plist ================================================ Label com.github.dnscrypt-osxclient.DNSCryptNetworkChange KeepAlive RunAtLoad WorkingDirectory /Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/scripts ProgramArguments /Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/scripts/handle-network-change.sh ExitTimeOut 300 ThrottleInterval 1 Nice 1 UserName root WatchPaths /Library/Preferences/SystemConfiguration ================================================ FILE: DNSCrypt-OSX-Installer/sign.sh ================================================ #! /bin/sh VERSION='1.0.4' cd build || exit 1 [ -d DNSCrypt.mpkg ] || exit 1 ( cd DNSCrypt.mpkg/Contents/Packages || exit 1 for pkg in *pkg ; do rm -fr "x-${pkg}" mv "$pkg" "x-${pkg}" productsign --sign 'Developer ID Installer' "x-${pkg}" "$pkg" rm -fr "x-${pkg}" done ) rm -fr DNSCrypt-OSX.mpkg DNSCrypt-unsigned.mpkg productsign --sign 'Developer ID Application' DNSCrypt.mpkg DNSCrypt-OSX.mpkg mv DNSCrypt.mpkg DNSCrypt-unsigned.mpkg mv DNSCrypt-OSX.mpkg DNSCrypt.mpkg zip -9 -r "dnscrypt-osxclient-${VERSION}.zip" DNSCrypt.mpkg rm -fr dnscrypt-pkg rm -f "dnscrypt-osxclient-${VERSION}.dmg" mkdir dnscrypt-pkg mv DNSCrypt.mpkg dnscrypt-pkg hdiutil create "dnscrypt-osxclient-${VERSION}.dmg" -srcfolder dnscrypt-pkg mv dnscrypt-pkg/DNSCrypt.mpkg . rm -fr dnscrypt-pkg rm -fr DNSCrypt-unsigned.mpkg ================================================ FILE: DNSCrypt-Preference-Pane/COPYING ================================================ /* * Copyright (c) 2011-2014 OpenDNS, Inc. * Copyright (c) 2014 AlterStep * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ The get-dhcp-resolvers.sh and check-network-change.sh scripts use code snippets from the dnssec-trigger project, by Wouter Wijngaards, NLnet Labs. (great and similar project, check it out: http://www.nlnetlabs.nl/projects/dnssec-trigger/) ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/CHCSVParser/CHCSVParser.h ================================================ // // CHCSVParser.h // CHCSVParser /** Copyright (c) 2012 Dave DeLong 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. **/ #import extern NSString * const CHCSVErrorDomain; enum { CHCSVErrorCodeInvalidFormat = 1, }; typedef NSInteger CHCSVErrorCode; @class CHCSVParser; @protocol CHCSVParserDelegate @optional - (void)parserDidBeginDocument:(CHCSVParser *)parser; - (void)parserDidEndDocument:(CHCSVParser *)parser; - (void)parser:(CHCSVParser *)parser didBeginLine:(NSUInteger)recordNumber; - (void)parser:(CHCSVParser *)parser didEndLine:(NSUInteger)recordNumber; - (void)parser:(CHCSVParser *)parser didReadField:(NSString *)field atIndex:(NSInteger)fieldIndex; - (void)parser:(CHCSVParser *)parser didReadComment:(NSString *)comment; - (void)parser:(CHCSVParser *)parser didFailWithError:(NSError *)error; @end @interface CHCSVParser : NSObject @property (assign) id delegate; @property (assign) BOOL recognizesBackslashesAsEscapes; // default is NO @property (assign) BOOL sanitizesFields; // default is NO @property (assign) BOOL recognizesComments; // default is NO @property (assign) BOOL stripsLeadingAndTrailingWhitespace; // default is NO @property (readonly) NSUInteger totalBytesRead; // designated initializer - (id)initWithInputStream:(NSInputStream *)stream usedEncoding:(NSStringEncoding *)encoding delimiter:(unichar)delimiter; - (id)initWithCSVString:(NSString *)csv; - (id)initWithCSVString:(NSString *)csv delimiter:(unichar)delimiter; - (id)initWithContentsOfCSVFile:(NSString *)csvFilePath; - (id)initWithContentsOfCSVFile:(NSString *)csvFilePath delimiter:(unichar)delimiter; - (void)parse; - (void)cancelParsing; @end @interface CHCSVWriter : NSObject - (instancetype)initForWritingToCSVFile:(NSString *)path; - (instancetype)initWithOutputStream:(NSOutputStream *)stream encoding:(NSStringEncoding)encoding delimiter:(unichar)delimiter; - (void)writeField:(NSString *)field; - (void)finishLine; - (void)writeLineOfFields:(id)fields; - (void)writeComment:(NSString *)comment; - (void)closeStream; @end #pragma mark - Convenience Categories typedef NS_OPTIONS(NSUInteger, CHCSVParserOptions) { CHCSVParserOptionsRecognizesBackslashesAsEscapes = 1 << 0, CHCSVParserOptionsSanitizesFields = 1 << 1, CHCSVParserOptionsRecognizesComments = 1 << 2, CHCSVParserOptionsStripsLeadingAndTrailingWhitespace = 1 << 3 }; @interface NSArray (CHCSVAdditions) + (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath; + (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath delimiter:(unichar)delimiter; + (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options; + (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options delimiter:(unichar)delimiter; - (NSString *)CSVString; @end @interface NSString (CHCSVAdditions) - (NSArray *)CSVComponents; - (NSArray *)CSVComponentsWithDelimiter:(unichar)delimiter; - (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options; - (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options delimiter:(unichar)delimiter; @end ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/CHCSVParser/CHCSVParser.m ================================================ // // CHCSVParser.m // CHCSVParser /** Copyright (c) 2012 Dave DeLong 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. **/ #import "CHCSVParser.h" NSString *const CHCSVErrorDomain = @"com.davedelong.csv"; #define CHUNK_SIZE 512 #define DOUBLE_QUOTE '"' #define COMMA ',' #define OCTOTHORPE '#' #define BACKSLASH '\\' #if __has_feature(objc_arc) #define CHCSV_HAS_ARC 1 #define CHCSV_RETAIN(_o) (_o) #define CHCSV_RELEASE(_o) #define CHCSV_AUTORELEASE(_o) (_o) #else #define CHCSV_HAS_ARC 0 #define CHCSV_RETAIN(_o) [(_o) retain] #define CHCSV_RELEASE(_o) [(_o) release] #define CHCSV_AUTORELEASE(_o) [(_o) autorelease] #endif @interface CHCSVParser () @property (assign) NSUInteger totalBytesRead; @end @implementation CHCSVParser { NSInputStream *_stream; NSStringEncoding _streamEncoding; NSMutableData *_stringBuffer; NSMutableString *_string; NSCharacterSet *_validFieldCharacters; NSUInteger _nextIndex; NSInteger _fieldIndex; NSRange _fieldRange; NSMutableString *_sanitizedField; unichar _delimiter; NSError *_error; NSUInteger _currentRecord; BOOL _cancelled; } - (id)initWithCSVString:(NSString *)csv { NSStringEncoding encoding = [csv fastestEncoding]; NSInputStream *stream = [NSInputStream inputStreamWithData:[csv dataUsingEncoding:encoding]]; return [self initWithInputStream:stream usedEncoding:&encoding delimiter:COMMA]; } - (id)initWithCSVString:(NSString *)csv delimiter:(unichar)delimiter { NSStringEncoding encoding = [csv fastestEncoding]; NSInputStream *stream = [NSInputStream inputStreamWithData:[csv dataUsingEncoding:encoding]]; return [self initWithInputStream:stream usedEncoding:&encoding delimiter:delimiter]; } - (id)initWithContentsOfCSVFile:(NSString *)csvFilePath { NSInputStream *stream = [NSInputStream inputStreamWithFileAtPath:csvFilePath]; NSStringEncoding encoding = 0; return [self initWithInputStream:stream usedEncoding:&encoding delimiter:COMMA]; } - (id)initWithContentsOfCSVFile:(NSString *)csvFilePath delimiter:(unichar)delimiter { NSInputStream *stream = [NSInputStream inputStreamWithFileAtPath:csvFilePath]; NSStringEncoding encoding = 0; return [self initWithInputStream:stream usedEncoding:&encoding delimiter:delimiter]; } - (id)initWithInputStream:(NSInputStream *)stream usedEncoding:(NSStringEncoding *)encoding delimiter:(unichar)delimiter { NSParameterAssert(stream); NSParameterAssert(delimiter); NSAssert([[NSCharacterSet newlineCharacterSet] characterIsMember:delimiter] == NO, @"The field delimiter may not be a newline"); NSAssert(delimiter != DOUBLE_QUOTE, @"The field delimiter may not be a double quote"); NSAssert(delimiter != OCTOTHORPE, @"The field delimiter may not be an octothorpe"); self = [super init]; if (self) { _stream = CHCSV_RETAIN(stream); [_stream open]; _stringBuffer = [[NSMutableData alloc] init]; _string = [[NSMutableString alloc] init]; _delimiter = delimiter; _nextIndex = 0; _recognizesComments = NO; _recognizesBackslashesAsEscapes = NO; _sanitizesFields = NO; _sanitizedField = [[NSMutableString alloc] init]; _stripsLeadingAndTrailingWhitespace = NO; NSMutableCharacterSet *m = [[NSCharacterSet newlineCharacterSet] mutableCopy]; NSString *invalid = [NSString stringWithFormat:@"%c%C", DOUBLE_QUOTE, _delimiter]; [m addCharactersInString:invalid]; _validFieldCharacters = CHCSV_RETAIN([m invertedSet]); CHCSV_RELEASE(m); if (encoding == NULL || *encoding == 0) { // we need to determine the encoding [self _sniffEncoding]; if (encoding) { *encoding = _streamEncoding; } } else { _streamEncoding = *encoding; } } return self; } - (void)dealloc { [_stream close]; #if !CHCSV_HAS_ARC [_stream release]; [_stringBuffer release]; [_string release]; [_sanitizedField release]; [_validFieldCharacters release]; [super dealloc]; #endif } #pragma mark - - (void)_sniffEncoding { NSStringEncoding encoding = NSUTF8StringEncoding; uint8_t bytes[CHUNK_SIZE]; NSInteger readLength = [_stream read:bytes maxLength:CHUNK_SIZE]; if (readLength > 0 && readLength <= CHUNK_SIZE) { [_stringBuffer appendBytes:bytes length:readLength]; [self setTotalBytesRead:[self totalBytesRead] + readLength]; NSInteger bomLength = 0; if (readLength > 3 && bytes[0] == 0x00 && bytes[1] == 0x00 && bytes[2] == 0xFE && bytes[3] == 0xFF) { encoding = NSUTF32BigEndianStringEncoding; bomLength = 4; } else if (readLength > 3 && bytes[0] == 0xFF && bytes[1] == 0xFE && bytes[2] == 0x00 && bytes[3] == 0x00) { encoding = NSUTF32LittleEndianStringEncoding; bomLength = 4; } else if (readLength > 3 && bytes[0] == 0x1B && bytes[1] == 0x24 && bytes[2] == 0x29 && bytes[3] == 0x43) { encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingISO_2022_KR); bomLength = 4; } else if (readLength > 1 && bytes[0] == 0xFE && bytes[1] == 0xFF) { encoding = NSUTF16BigEndianStringEncoding; bomLength = 2; } else if (readLength > 1 && bytes[0] == 0xFF && bytes[1] == 0xFE) { encoding = NSUTF16LittleEndianStringEncoding; bomLength = 2; } else if (readLength > 2 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) { encoding = NSUTF8StringEncoding; bomLength = 3; } else { NSString *bufferAsUTF8 = nil; for (NSInteger triedLength = 0; triedLength < 4; ++triedLength) { bufferAsUTF8 = CHCSV_AUTORELEASE([[NSString alloc] initWithBytes:bytes length:readLength-triedLength encoding:NSUTF8StringEncoding]); if (bufferAsUTF8 != nil) { break; } } if (bufferAsUTF8 != nil) { encoding = NSUTF8StringEncoding; } else { NSLog(@"unable to determine stream encoding; assuming MacOSRoman"); encoding = NSMacOSRomanStringEncoding; } } if (bomLength > 0) { [_stringBuffer replaceBytesInRange:NSMakeRange(0, bomLength) withBytes:NULL length:0]; } } _streamEncoding = encoding; } - (void)_loadMoreIfNecessary { NSUInteger stringLength = [_string length]; NSUInteger reloadPortion = stringLength / 3; if (reloadPortion < 10) { reloadPortion = 10; } if ([_stream hasBytesAvailable] && _nextIndex+reloadPortion >= stringLength) { // read more from the stream uint8_t buffer[CHUNK_SIZE]; NSInteger readBytes = [_stream read:buffer maxLength:CHUNK_SIZE]; if (readBytes > 0) { // append it to the buffer [_stringBuffer appendBytes:buffer length:readBytes]; [self setTotalBytesRead:[self totalBytesRead] + readBytes]; } } if ([_stringBuffer length] > 0) { // try to turn the next portion of the buffer into a string NSUInteger readLength = [_stringBuffer length]; while (readLength > 0) { NSString *readString = [[NSString alloc] initWithBytes:[_stringBuffer bytes] length:readLength encoding:_streamEncoding]; if (readString == nil) { readLength--; } else { [_string appendString:readString]; CHCSV_RELEASE(readString); break; } }; [_stringBuffer replaceBytesInRange:NSMakeRange(0, readLength) withBytes:NULL length:0]; } } - (void)_advance { [self _loadMoreIfNecessary]; _nextIndex++; } - (unichar)_peekCharacter { [self _loadMoreIfNecessary]; if (_nextIndex >= [_string length]) { return '\0'; } return [_string characterAtIndex:_nextIndex]; } - (unichar)_peekPeekCharacter { [self _loadMoreIfNecessary]; NSUInteger nextNextIndex = _nextIndex+1; if (nextNextIndex >= [_string length]) { return '\0'; } return [_string characterAtIndex:nextNextIndex]; } #pragma mark - - (void)parse { [self _beginDocument]; _currentRecord = 0; while ([self _parseRecord]) { ; // yep; } if (_error != nil) { [self _error]; } else { [self _endDocument]; } } - (void)cancelParsing { _cancelled = YES; } - (BOOL)_parseRecord { while ([self _peekCharacter] == OCTOTHORPE && _recognizesComments) { [self _parseComment]; } [self _beginRecord]; while (1) { if (![self _parseField]) { break; } if (![self _parseDelimiter]) { break; } } BOOL followedByNewline = [self _parseNewline]; [self _endRecord]; return (followedByNewline && _error == nil); } - (BOOL)_parseNewline { if (_cancelled) { return NO; } NSUInteger charCount = 0; while ([[NSCharacterSet newlineCharacterSet] characterIsMember:[self _peekCharacter]]) { charCount++; [self _advance]; } return (charCount > 0); } - (BOOL)_parseComment { [self _advance]; // consume the octothorpe NSCharacterSet *newlines = [NSCharacterSet newlineCharacterSet]; [self _beginComment]; BOOL isBackslashEscaped = NO; while (1) { if (isBackslashEscaped == NO) { unichar next = [self _peekCharacter]; if (next == BACKSLASH && _recognizesBackslashesAsEscapes) { isBackslashEscaped = YES; [self _advance]; } else if ([newlines characterIsMember:next] == NO) { [self _advance]; } else { // it's a newline break; } } else { isBackslashEscaped = YES; [self _advance]; } } [self _endComment]; return [self _parseNewline]; } - (void)_parseFieldWhitespace { NSCharacterSet *whitespace = [NSCharacterSet whitespaceCharacterSet]; while ([self _peekCharacter] != '\0' && [whitespace characterIsMember:[self _peekCharacter]] && [self _peekCharacter] != _delimiter) { // if we're sanitizing fields, then these characters would be stripped (because they're not appended to _sanitizedField) // if we're not sanitizing fields, then they'll be included in the -substringWithRange: [self _advance]; } } - (BOOL)_parseField { if (_cancelled) { return NO; } BOOL parsedField = NO; [self _beginField]; if (_stripsLeadingAndTrailingWhitespace) { // consume leading whitespace [self _parseFieldWhitespace]; } if ([self _peekCharacter] == DOUBLE_QUOTE) { parsedField = [self _parseEscapedField]; } else { parsedField = [self _parseUnescapedField]; if (_stripsLeadingAndTrailingWhitespace) { NSString *trimmedString = [_sanitizedField stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; [_sanitizedField setString:trimmedString]; } } if (parsedField) { if (_stripsLeadingAndTrailingWhitespace) { // consume trailing whitespace [self _parseFieldWhitespace]; } [self _endField]; } return parsedField; } - (BOOL)_parseEscapedField { [self _advance]; // consume the opening double quote NSCharacterSet *newlines = [NSCharacterSet newlineCharacterSet]; BOOL isBackslashEscaped = NO; while (1) { unichar next = [self _peekCharacter]; if (next == '\0') { break; } if (isBackslashEscaped == NO) { if (next == BACKSLASH && _recognizesBackslashesAsEscapes) { isBackslashEscaped = YES; [self _advance]; // consume the backslash } else if ([_validFieldCharacters characterIsMember:next] || [newlines characterIsMember:next] || next == _delimiter) { [_sanitizedField appendFormat:@"%C", next]; [self _advance]; } else if (next == DOUBLE_QUOTE && [self _peekPeekCharacter] == DOUBLE_QUOTE) { [_sanitizedField appendFormat:@"%C", next]; [self _advance]; [self _advance]; } else { // not valid, or it's not a doubled double quote break; } } else { [_sanitizedField appendFormat:@"%C", next]; isBackslashEscaped = NO; [self _advance]; } } if ([self _peekCharacter] == DOUBLE_QUOTE) { [self _advance]; return YES; } return NO; } - (BOOL)_parseUnescapedField { BOOL isBackslashEscaped = NO; while (1) { unichar next = [self _peekCharacter]; if (next == '\0') { break; } if (isBackslashEscaped == NO) { if (next == BACKSLASH && _recognizesBackslashesAsEscapes) { isBackslashEscaped = YES; [self _advance]; } else if ([_validFieldCharacters characterIsMember:next]) { [_sanitizedField appendFormat:@"%C", next]; [self _advance]; } else { break; } } else { isBackslashEscaped = NO; [_sanitizedField appendFormat:@"%C", next]; [self _advance]; } } return YES; } - (BOOL)_parseDelimiter { unichar next = [self _peekCharacter]; if (next == _delimiter) { [self _advance]; return YES; } if (next != '\0' && [[NSCharacterSet newlineCharacterSet] characterIsMember:next] == NO) { NSString *description = [NSString stringWithFormat:@"Unexpected delimiter. Expected '%C' (0x%X), but got '%C' (0x%X)", _delimiter, _delimiter, [self _peekCharacter], [self _peekCharacter]]; _error = [[NSError alloc] initWithDomain:CHCSVErrorDomain code:CHCSVErrorCodeInvalidFormat userInfo:@{NSLocalizedDescriptionKey : description}]; } return NO; } - (void)_beginDocument { if ([_delegate respondsToSelector:@selector(parserDidBeginDocument:)]) { [_delegate parserDidBeginDocument:self]; } } - (void)_endDocument { if ([_delegate respondsToSelector:@selector(parserDidEndDocument:)]) { [_delegate parserDidEndDocument:self]; } } - (void)_beginRecord { if (_cancelled) { return; } _fieldIndex = 0; _currentRecord++; if ([_delegate respondsToSelector:@selector(parser:didBeginLine:)]) { [_delegate parser:self didBeginLine:_currentRecord]; } } - (void)_endRecord { if (_cancelled) { return; } if ([_delegate respondsToSelector:@selector(parser:didEndLine:)]) { [_delegate parser:self didEndLine:_currentRecord]; } } - (void)_beginField { if (_cancelled) { return; } [_sanitizedField setString:@""]; _fieldRange.location = _nextIndex; } - (void)_endField { if (_cancelled) { return; } _fieldRange.length = (_nextIndex - _fieldRange.location); NSString *field = nil; if (_sanitizesFields) { field = CHCSV_AUTORELEASE([_sanitizedField copy]); } else { field = [_string substringWithRange:_fieldRange]; if (_stripsLeadingAndTrailingWhitespace) { field = [field stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; } } if ([_delegate respondsToSelector:@selector(parser:didReadField:atIndex:)]) { [_delegate parser:self didReadField:field atIndex:_fieldIndex]; } [_string replaceCharactersInRange:NSMakeRange(0, NSMaxRange(_fieldRange)) withString:@""]; _nextIndex = 0; _fieldIndex++; } - (void)_beginComment { if (_cancelled) { return; } _fieldRange.location = _nextIndex; } - (void)_endComment { if (_cancelled) { return; } _fieldRange.length = (_nextIndex - _fieldRange.location); if ([_delegate respondsToSelector:@selector(parser:didReadComment:)]) { NSString *comment = [_string substringWithRange:_fieldRange]; [_delegate parser:self didReadComment:comment]; } [_string replaceCharactersInRange:NSMakeRange(0, NSMaxRange(_fieldRange)) withString:@""]; _nextIndex = 0; } - (void)_error { if (_cancelled) { return; } if ([_delegate respondsToSelector:@selector(parser:didFailWithError:)]) { [_delegate parser:self didFailWithError:_error]; } } @end @implementation CHCSVWriter { NSOutputStream *_stream; NSStringEncoding _streamEncoding; NSData *_delimiter; NSData *_bom; NSCharacterSet *_illegalCharacters; NSUInteger _currentField; } - (instancetype)initForWritingToCSVFile:(NSString *)path { NSOutputStream *stream = [NSOutputStream outputStreamToFileAtPath:path append:NO]; return [self initWithOutputStream:stream encoding:NSUTF8StringEncoding delimiter:COMMA]; } - (instancetype)initWithOutputStream:(NSOutputStream *)stream encoding:(NSStringEncoding)encoding delimiter:(unichar)delimiter { self = [super init]; if (self) { _stream = CHCSV_RETAIN(stream); _streamEncoding = encoding; if ([_stream streamStatus] == NSStreamStatusNotOpen) { [_stream open]; } NSData *a = [@"a" dataUsingEncoding:_streamEncoding]; NSData *aa = [@"aa" dataUsingEncoding:_streamEncoding]; if ([a length] * 2 != [aa length]) { NSUInteger characterLength = [aa length] - [a length]; _bom = CHCSV_RETAIN([a subdataWithRange:NSMakeRange(0, [a length] - characterLength)]); [self _writeData:_bom]; } NSString *delimiterString = [NSString stringWithFormat:@"%C", delimiter]; NSData *delimiterData = [delimiterString dataUsingEncoding:_streamEncoding]; if ([_bom length] > 0) { _delimiter = CHCSV_RETAIN([delimiterData subdataWithRange:NSMakeRange([_bom length], [delimiterData length] - [_bom length])]); } else { _delimiter = CHCSV_RETAIN(delimiterData); } NSMutableCharacterSet *illegalCharacters = [[NSCharacterSet newlineCharacterSet] mutableCopy]; [illegalCharacters addCharactersInString:delimiterString]; [illegalCharacters addCharactersInString:@"\""]; _illegalCharacters = [illegalCharacters copy]; CHCSV_RELEASE(illegalCharacters); } return self; } - (void)dealloc { [self closeStream]; #if !CHCSV_HAS_ARC [_delimiter release]; [_bom release]; [_illegalCharacters release]; [super dealloc]; #endif } - (void)_writeData:(NSData *)data { if ([data length] > 0) { const void *bytes = [data bytes]; [_stream write:bytes maxLength:[data length]]; } } - (void)_writeString:(NSString *)string { NSData *stringData = [string dataUsingEncoding:_streamEncoding]; if ([_bom length] > 0) { stringData = [stringData subdataWithRange:NSMakeRange([_bom length], [stringData length] - [_bom length])]; } [self _writeData:stringData]; } - (void)_writeDelimiter { [self _writeData:_delimiter]; } - (void)writeField:(id)field { if (_currentField > 0) { [self _writeDelimiter]; } NSString *string = field ? [field description] : @""; if ([string rangeOfCharacterFromSet:_illegalCharacters].location != NSNotFound) { // replace double quotes with double double quotes string = [string stringByReplacingOccurrencesOfString:@"\"" withString:@"\"\""]; // surround in double quotes string = [NSString stringWithFormat:@"\"%@\"", string]; } [self _writeString:string]; _currentField++; } - (void)finishLine { [self _writeString:@"\n"]; _currentField = 0; } - (void)_finishLineIfNecessary { if (_currentField != 0) { [self finishLine]; } } - (void)writeLineOfFields:(id)fields { [self _finishLineIfNecessary]; for (id field in fields) { [self writeField:field]; } [self finishLine]; } - (void)writeComment:(NSString *)comment { [self _finishLineIfNecessary]; NSArray *lines = [comment componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; for (NSString *line in lines) { NSString *commented = [NSString stringWithFormat:@"#%@\n", line]; [self _writeString:commented]; } } - (void)closeStream { [_stream close]; CHCSV_RELEASE(_stream); _stream = nil; } @end #pragma mark - Convenience Categories @interface _CHCSVAggregator : NSObject @property (readonly) NSArray *lines; @property (readonly) NSError *error; @end @implementation _CHCSVAggregator { NSMutableArray *_lines; NSMutableArray *_currentLine; } #if !CHCSV_HAS_ARC - (void)dealloc { [_currentLine release]; [_lines release]; [_error release]; [super dealloc]; } #endif - (void)parserDidBeginDocument:(CHCSVParser *)parser { _lines = [[NSMutableArray alloc] init]; } - (void)parser:(CHCSVParser *)parser didBeginLine:(NSUInteger)recordNumber { _currentLine = [[NSMutableArray alloc] init]; } - (void)parser:(CHCSVParser *)parser didEndLine:(NSUInteger)recordNumber { [_lines addObject:_currentLine]; CHCSV_RELEASE(_currentLine); _currentLine = nil; } - (void)parser:(CHCSVParser *)parser didReadField:(NSString *)field atIndex:(NSInteger)fieldIndex { [_currentLine addObject:field]; } - (void)parser:(CHCSVParser *)parser didFailWithError:(NSError *)error { _error = CHCSV_RETAIN(error); CHCSV_RELEASE(_lines); _lines = nil; } @end @implementation NSArray (CHCSVAdditions) + (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath { return [self arrayWithContentsOfCSVFile:csvFilePath options:0 delimiter:COMMA]; } + (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath delimiter:(unichar)delimiter { return [self arrayWithContentsOfCSVFile:csvFilePath options:0 delimiter:delimiter]; } + (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options { return [self arrayWithContentsOfCSVFile:csvFilePath options:options delimiter:COMMA]; } + (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options delimiter:(unichar)delimiter { NSParameterAssert(csvFilePath); _CHCSVAggregator *aggregator = [[_CHCSVAggregator alloc] init]; CHCSVParser *parser = [[CHCSVParser alloc] initWithContentsOfCSVFile:csvFilePath delimiter:delimiter]; [parser setDelegate:aggregator]; [parser setRecognizesBackslashesAsEscapes:!!(options & CHCSVParserOptionsRecognizesBackslashesAsEscapes)]; [parser setSanitizesFields:!!(options & CHCSVParserOptionsSanitizesFields)]; [parser setRecognizesComments:!!(options & CHCSVParserOptionsRecognizesComments)]; [parser setStripsLeadingAndTrailingWhitespace:!!(options & CHCSVParserOptionsStripsLeadingAndTrailingWhitespace)]; [parser parse]; CHCSV_RELEASE(parser); NSArray *final = CHCSV_AUTORELEASE(CHCSV_RETAIN([aggregator lines])); CHCSV_RELEASE(aggregator); return final; } - (NSString *)CSVString { NSOutputStream *output = [NSOutputStream outputStreamToMemory]; CHCSVWriter *writer = [[CHCSVWriter alloc] initWithOutputStream:output encoding:NSUTF8StringEncoding delimiter:COMMA]; for (id object in self) { if ([object conformsToProtocol:@protocol(NSFastEnumeration)]) { [writer writeLineOfFields:object]; } } [writer closeStream]; CHCSV_RELEASE(writer); NSData *buffer = [output propertyForKey:NSStreamDataWrittenToMemoryStreamKey]; NSString *string = [[NSString alloc] initWithData:buffer encoding:NSUTF8StringEncoding]; return CHCSV_AUTORELEASE(string); } @end @implementation NSString (CHCSVAdditions) - (NSArray *)CSVComponents { return [self CSVComponentsWithOptions:0 delimiter:COMMA]; } - (NSArray *)CSVComponentsWithDelimiter:(unichar)delimiter { return [self CSVComponentsWithOptions:0 delimiter:delimiter]; } - (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options { return [self CSVComponentsWithOptions:options delimiter:COMMA]; } - (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options delimiter:(unichar)delimiter { _CHCSVAggregator *aggregator = [[_CHCSVAggregator alloc] init]; CHCSVParser *parser = [[CHCSVParser alloc] initWithCSVString:self delimiter:delimiter]; [parser setDelegate:aggregator]; [parser setRecognizesBackslashesAsEscapes:!!(options & CHCSVParserOptionsRecognizesBackslashesAsEscapes)]; [parser setSanitizesFields:!!(options & CHCSVParserOptionsSanitizesFields)]; [parser setRecognizesComments:!!(options & CHCSVParserOptionsRecognizesComments)]; [parser setStripsLeadingAndTrailingWhitespace:!!(options & CHCSVParserOptionsStripsLeadingAndTrailingWhitespace)]; [parser parse]; CHCSV_RELEASE(parser); NSArray *final = CHCSV_AUTORELEASE(CHCSV_RETAIN([aggregator lines])); CHCSV_RELEASE(aggregator); return final; } @end ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/DNSCrypt-Info.plist ================================================ CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFile CFBundleIdentifier com.github.dnscrypt-osxclient.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType BNDL CFBundleShortVersionString 1.0.4 CFBundleSignature ???? CFBundleVersion 1.0.4 NSHumanReadableCopyright BSD NSMainNibFile DNSCrypt NSPrefPaneIconFile dnscrypt_256.png NSPrefPaneIconLabel DNSCrypt NSPrincipalClass DNSCrypt ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/DNSCrypt-Prefix.pch ================================================ // // Prefix header for all source files of the 'DNSCrypt' target in the 'DNSCrypt' project // #ifdef __OBJC__ #import #endif ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/DNSCrypt.h ================================================ #import #import #import "CHCSVParser/CHCSVParser.h" #define kDNSCRYPT_PACKAGE_VERSION @"1.0.4" #define kDNSCRYPT_PREFPANE_APP_PATH @"/Library/PreferencePanes/DNSCrypt.prefPane" #define kDNSCRYPT_USR_BASE_DIR kDNSCRYPT_PREFPANE_APP_PATH @"/Contents/Resources/usr" #define kDNSCRIPT_BIN_BASE_DIR kDNSCRYPT_USR_BASE_DIR @"/bin" #define kDNSCRIPT_SCRIPTS_BASE_DIR kDNSCRYPT_USR_BASE_DIR @"/scripts" #define kDNSCRYPT_VAR_BASE_DIR @"/Library/Application Support/DNSCrypt" #define kDNSCRYPT_CONTROL_DIR kDNSCRYPT_VAR_BASE_DIR @"/control" #define kDNSCRYPT_QUERY_LOG_FILE @"/var/log/dnscrypt-query.log" #define kDNSCRYPT_BLACKLIST_IPS_TMP_FILE kDNSCRYPT_CONTROL_DIR @"/blacklist-ips.tmp" #define kDNSCRYPT_BLACKLIST_DOMAINS_TMP_FILE kDNSCRYPT_CONTROL_DIR @"/blacklist-domains.tmp" #define kDNSCRYPT_EXCEPTIONS_TMP_FILE kDNSCRYPT_CONTROL_DIR @"/exceptions.tmp" #define kBUNDLE_IDENTIFIER @"com.github.dnscrypt-osxclient.DNSCrypt" #define kRESOLVERS_LIST_FILE @"/usr/local/share/dnscrypt-proxy/dnscrypt-resolvers.csv" #define kREFRESH_DELAY 2.0 #define kCHECKBOXES_AFTER_CHANGE_DELAY 8.0 #define kMAX_TRIES_AFTER_CHANGE (30 / kREFRESH_DELAY) typedef enum { kDNS_CONFIGURATION_UNKNOWN, kDNS_CONFIGURATION_VANILLA, kDNS_CONFIGURATION_LOCALHOST } DNSConfigurationState; @interface DNSCrypt : NSPreferencePane { AuthorizationRef auth; NSTabView *_tabView; NSTabViewItem *_aboutTabViewItem; NSTabViewItem *_releaseNotesTabViewItem; NSButton *_dnscryptButton; NSButton *_fallbackButton; NSTextField *_currentResolverTextField; NSImageView *_statusImageView; NSTextField *_statusText; WebView *_releaseNotesWebView; WebView *_aboutWebView; NSTextFieldCell *_staticResolversTextField; NSTextField *_blacklistIPsTextField; NSTextField *_blacklistDomainsTextField; NSTextField *_exceptionsTextField; WebView *_helpWebView; NSButton *_viewLogButton; NSButton *_queryLoggingButton; NSPopUpButton *_resolverNamesButton; } @property (nonatomic, strong) IBOutlet NSTabView *tabView; @property (nonatomic, strong) IBOutlet NSTabViewItem *aboutTabViewItem; @property (nonatomic, strong) IBOutlet NSTabViewItem *releaseNotesTabViewItem; @property (nonatomic, strong) IBOutlet NSButton *dnscryptButton; @property (nonatomic, strong) IBOutlet NSButton *fallbackButton; @property (nonatomic, strong) IBOutlet NSTextField *currentResolverTextField; @property (nonatomic, strong) IBOutlet NSImageView *statusImageView; @property (nonatomic, strong) IBOutlet NSTextField *statusText; @property (nonatomic, strong) IBOutlet WebView *releaseNotesWebView; @property (nonatomic, strong) IBOutlet WebView *aboutWebView; @property (nonatomic, strong) IBOutlet NSTextFieldCell *staticResolversTextField; @property (nonatomic, strong) IBOutlet NSTextField *blacklistIPsTextField; @property (nonatomic, strong) IBOutlet NSTextField *blacklistDomainsTextField; @property (nonatomic, strong) IBOutlet NSTextField *exceptionsTextField; @property (nonatomic, strong) IBOutlet WebView *helpWebView; @property (nonatomic, strong) IBOutlet NSButton *viewLogButton; @property (nonatomic, strong) IBOutlet NSButton *queryLoggingButton; @property (nonatomic, strong) IBOutlet NSPopUpButton *resolverNamesButton; @property (nonatomic, strong) IBOutlet NSTextField *locationText; @property (nonatomic, strong) IBOutlet NSButton *providerLink; @property (nonatomic, strong) IBOutlet NSTextFieldCell *descriptionText; - (void) mainViewDidLoad; - (IBAction)dnscryptButtonPressed:(NSButton *)sender; - (IBAction)fallbackButtonPressed:(NSButton *)sender; - (IBAction)providerLinkPushed:(NSButton *)sender; - (IBAction)uninstallPushed:(NSButton *)sender; - (IBAction)staticResolversTextFieldChanged:(NSTextField *)sender; - (IBAction)queryLoggingButtonPressed:(NSButtonCell *)sender; - (IBAction)viewLogButtonPushed:(NSButton *)sender; - (IBAction)blacklistIPsUpdated:(NSTextField *)sender; - (IBAction)blacklistDomainsUpdated:(NSTextField *)sender; - (IBAction)exceptionsUpdated:(NSTextField *)sender; - (IBAction)helpButtonPressed:(NSButton *)sender; - (IBAction)resolversNamesPopupButtonPressed:(NSPopUpButton *)sender; @end ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/DNSCrypt.m ================================================ #import "DNSCrypt.h" @implementation DNSCrypt @synthesize tabView = _tabView; @synthesize aboutTabViewItem = _aboutTabViewItem; @synthesize releaseNotesTabViewItem = _releaseNotesTabViewItem; @synthesize releaseNotesWebView = _releaseNotesWebView; @synthesize aboutWebView = _aboutWebView; @synthesize staticResolversTextField = _staticResolversTextField; @synthesize blacklistIPsTextField = _blacklistIPsTextField; @synthesize blacklistDomainsTextField = _blacklistDomainsTextField; @synthesize helpWebView = _helpWebView; @synthesize viewLogButton = _viewLogButton; @synthesize queryLoggingButton = _queryLoggingButton; @synthesize exceptionsTextField = _exceptionsTextField; @synthesize dnscryptButton = _dnscryptButton; @synthesize fallbackButton = _fallbackButton; @synthesize statusImageView = _statusImageView; @synthesize statusText = _statusText; @synthesize currentResolverTextField = _currentResolverTextField; @synthesize resolverNamesButton = _resolverNamesButton; DNSConfigurationState currentState = kDNS_CONFIGURATION_UNKNOWN; NSArray *resolversList; - (void) setCheckBoxesEnabled: (BOOL) enabled { [_dnscryptButton setEnabled: enabled]; [_fallbackButton setEnabled: enabled]; } - (NSString *) fromCommand: (NSString *) launchPath withArguments: (NSArray *) arguments { NSPipe *pipe = [[NSPipe alloc] init]; NSTask *task = [[NSTask alloc] init]; NSData *data; NSString *result; task.launchPath = launchPath; task.arguments = arguments; task.standardOutput = pipe; [task launch]; data = [[pipe fileHandleForReading] readDataToEndOfFile]; [task waitUntilExit]; result = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; if ([result hasSuffix: @"\n"]) { result = [result substringToIndex: result.length - 1]; } return result; } - (void) initState { NSString *res; _dnscryptButton.state = 0; _fallbackButton.state = 0; res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./get-dnscrypt-status.sh", nil]]; if ([res isEqualToString: @"yes"]) { [_dnscryptButton setState: 1]; } res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./get-fallback-status.sh", nil]]; if ([res isEqualToString: @"yes"]) { [_fallbackButton setState: 1]; } res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./get-static-resolvers.sh", nil]]; [_staticResolversTextField setStringValue: res]; res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./get-query-logging-status.sh", nil]]; if ([res isEqualToString: @"yes"]) { [_queryLoggingButton setState: 1]; } NSString *fileContent; fileContent = [NSString stringWithContentsOfFile: kDNSCRYPT_BLACKLIST_IPS_TMP_FILE encoding:NSUTF8StringEncoding error: nil]; if (fileContent != nil) { [_blacklistIPsTextField setStringValue: fileContent]; } fileContent = [NSString stringWithContentsOfFile: kDNSCRYPT_BLACKLIST_DOMAINS_TMP_FILE encoding:NSUTF8StringEncoding error: nil]; if (fileContent != nil) { [_blacklistDomainsTextField setStringValue: fileContent]; } fileContent = [NSString stringWithContentsOfFile: kDNSCRYPT_EXCEPTIONS_TMP_FILE encoding:NSUTF8StringEncoding error: nil]; if (fileContent != nil) { [_exceptionsTextField setStringValue: fileContent]; } [_resolverNamesButton removeAllItems]; resolversList = [NSArray arrayWithContentsOfCSVFile: kRESOLVERS_LIST_FILE options:CHCSVParserOptionsSanitizesFields | CHCSVParserOptionsStripsLeadingAndTrailingWhitespace]; NSUInteger rows_count = [resolversList count]; NSUInteger i; [_resolverNamesButton addItemWithTitle: NSLocalizedString(@"Please select a resolver", @"A resolver hasn't been selected yet")]; res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./get-dnscrypt-resolver-name.sh", nil]]; for (i = 1U; i < rows_count; i++) { NSArray *row = [resolversList objectAtIndex: i]; NSString *name; if (row.count < 4) { continue; } name = [row objectAtIndex: 1]; [_resolverNamesButton addItemWithTitle: name]; if ([[row objectAtIndex: 0] isEqualToString: res]) { [_resolverNamesButton selectItemAtIndex: i]; [self updateResolverInfo: row]; } } } - (void) updateLedStatus { NSBundle *bundle = [NSBundle bundleWithIdentifier: @"com.github.dnscrypt-osxclient.DNSCrypt"]; switch (currentState) { case kDNS_CONFIGURATION_UNKNOWN: _statusText.stringValue = NSLocalizedString(@"Standby", @"Status"); _statusImageView.image = [[NSImage alloc] initWithContentsOfFile: [bundle pathForImageResource: @"shield_red.png"]]; break; case kDNS_CONFIGURATION_VANILLA: _statusText.stringValue = NSLocalizedString(@"Not using DNSCrypt", @"Status"); _statusImageView.image = [[NSImage alloc] initWithContentsOfFile: [bundle pathForImageResource: @"shield_red.png"]]; break; case kDNS_CONFIGURATION_LOCALHOST: _statusText.stringValue = NSLocalizedString(@"Using DNSCrypt", @"Status"); _statusImageView.image = [[NSImage alloc] initWithContentsOfFile: [bundle pathForImageResource: @"shield_green.png"]]; break; default: return; } } - (BOOL) updateStatusWithCurrentConfig { NSString *stateDescription = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./get-current-resolvers.sh | ./get-resolvers-description.sh", nil]]; if ([stateDescription isEqualToString: @"DNSCrypt"]) { currentState = kDNS_CONFIGURATION_LOCALHOST; } else if ([stateDescription isEqualToString: @"None"]) { currentState = kDNS_CONFIGURATION_UNKNOWN; } else if ([stateDescription isEqualToString: @"Updating"]) { currentState = kDNS_CONFIGURATION_UNKNOWN; } else if (stateDescription.length > 0) { currentState = kDNS_CONFIGURATION_VANILLA; } [self updateLedStatus]; NSString *currentResolvers = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./get-current-resolvers.sh | ./get-upstream-resolvers.sh", nil]]; _currentResolverTextField.stringValue = currentResolvers; NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./gui-pop-conf-change.sh prefpane", nil]]; if ([res isEqualToString: @"yes"]) { [self initState]; } [self setCheckBoxesEnabled: TRUE]; return TRUE; } - (void) periodicallyUpdateStatusWithCurrentConfig { [self updateStatusWithCurrentConfig]; [NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector(periodicallyUpdateStatusWithCurrentConfig) object: nil]; [self performSelector: @selector(periodicallyUpdateStatusWithCurrentConfig) withObject:nil afterDelay: kREFRESH_DELAY]; } - (void) showSpinners { NSBundle *bundle = [NSBundle bundleWithIdentifier: kBUNDLE_IDENTIFIER]; [self setCheckBoxesEnabled: FALSE]; _statusText.stringValue = NSLocalizedString(@"Updating", @"Updating network configuraiton"); _statusImageView.image = [[NSImage alloc] initWithContentsOfFile: [bundle pathForImageResource: @"ajax-loader.gif"]]; _currentResolverTextField.stringValue = @""; [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./gui-push-conf-change.sh menubar", nil]]; [NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector(periodicallyUpdateStatusWithCurrentConfig) object: nil]; [NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector(waitForUpdate) object: nil]; [self performSelector: @selector(waitForUpdate) withObject: self afterDelay:kREFRESH_DELAY]; } - (BOOL) setDNSCryptOn { [self showSpinners]; NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-to-dnscrypt.sh", nil]]; (void) res; return TRUE; } - (BOOL) setDNSCryptOff { [self showSpinners]; NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-to-dhcp.sh", nil]]; (void) res; return TRUE; } - (BOOL) setFallbackOn { [self showSpinners]; NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-fallback-on.sh", nil]]; (void) res; return TRUE; } - (BOOL) setFallbackOff { [self showSpinners]; NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-fallback-off.sh", nil]]; (void) res; return TRUE; } - (IBAction)dnscryptButtonPressed:(NSButton *)sender { if (sender.state != 0) { [self setDNSCryptOn]; } else { [self setDNSCryptOff]; } } - (IBAction)fallbackButtonPressed:(NSButton *)sender { if (sender.state != 0) { [self setFallbackOn]; } else { [self setFallbackOff]; } } - (void) waitForUpdate { NSString *res; static unsigned int tries; res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./get-tickets-count.sh", nil]]; if (res.length <= 0 || [res isEqualToString: @"0"] || tries > kMAX_TRIES_AFTER_CHANGE) { tries = 0U; [self periodicallyUpdateStatusWithCurrentConfig]; return; } tries++; [NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector(waitForUpdate) object: nil]; [self performSelector: @selector(waitForUpdate) withObject: self afterDelay:kREFRESH_DELAY]; } - (void) updateResolverInfo: (NSArray *) row { NSString *location = [row objectAtIndex: 3]; _locationText.stringValue = location; NSString *url = [row objectAtIndex: 5]; if (![url isEqualToString: @""]) { _providerLink.title = url; _providerLink.hidden = false; } else { _providerLink.hidden = true; } NSString *description = [row objectAtIndex: 2]; _descriptionText.stringValue = description; } - (IBAction)resolversNamesPopupButtonPressed:(NSPopUpButton *)sender { NSUInteger i = [sender indexOfSelectedItem]; if (i <= 0U || i >= resolversList.count) { return; } NSArray *row = [resolversList objectAtIndex: i]; [self updateResolverInfo: row]; setenv("RESOLVER_NAME", [[row objectAtIndex: 0] UTF8String], 1); [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./set-dnscrypt-resolver-name.sh \"$RESOLVER_NAME\"", nil]]; } - (void) mainViewDidLoad { currentState = kDNS_CONFIGURATION_UNKNOWN; [self initState]; [self periodicallyUpdateStatusWithCurrentConfig]; SInt32 OSXversionMajor, OSXversionMinor; if (Gestalt(gestaltSystemVersionMajor, &OSXversionMajor) != noErr || Gestalt(gestaltSystemVersionMinor, &OSXversionMinor) != noErr || OSXversionMajor < 10 || OSXversionMinor < 6) { return; } [_releaseNotesWebView setDrawsBackground:false]; [_releaseNotesWebView setShouldUpdateWhileOffscreen:true]; [_releaseNotesWebView setUIDelegate:self]; NSURL *releaseNotesURL; NSString *releaseNotesURLPath = [[NSBundle bundleForClass: [self class]] pathForResource: @"releasenotes" ofType: @"html" inDirectory: @"html"]; if (! releaseNotesURLPath || ! (releaseNotesURL = [NSURL fileURLWithPath: releaseNotesURLPath])) { [_tabView removeTabViewItem:_releaseNotesTabViewItem]; } else { [[_releaseNotesWebView mainFrame] loadRequest:[NSURLRequest requestWithURL: releaseNotesURL]]; } [_aboutWebView setDrawsBackground:false]; [_aboutWebView setShouldUpdateWhileOffscreen:true]; [_aboutWebView setUIDelegate:self]; NSURL *aboutURL; NSString *aboutURLPath = [[NSBundle bundleForClass: [self class]] pathForResource: @"about" ofType: @"html" inDirectory: @"html"]; if (! aboutURLPath || ! (aboutURL = [NSURL fileURLWithPath: aboutURLPath])) { [_tabView removeTabViewItem: _aboutTabViewItem]; } else { [[_aboutWebView mainFrame] loadRequest:[NSURLRequest requestWithURL: aboutURL]]; } [_helpWebView setDrawsBackground:false]; [_helpWebView setShouldUpdateWhileOffscreen:false]; [_helpWebView setUIDelegate:self]; NSURL *helpURL; NSString *helpURLPath = [[NSBundle bundleForClass: [self class]] pathForResource: @"help" ofType: @"html" inDirectory: @"html"]; if (! helpURLPath || ! (helpURL = [NSURL fileURLWithPath: helpURLPath])) { assert(0); } else { [[_helpWebView mainFrame] loadRequest:[NSURLRequest requestWithURL: helpURL]]; } } - (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems { return nil; } - (IBAction)providerLinkPushed:(NSButton *)sender { (void) sender; [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString: sender.title]]; } - (IBAction)uninstallPushed:(NSButton *)sender { [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_BIN_BASE_DIR @"' && /usr/bin/open ./Uninstall.app", nil]]; } - (IBAction)staticResolversTextFieldChanged:(NSTextField *)sender { NSString *staticResolvers = sender.stringValue; NSCharacterSet *charset = [[NSCharacterSet characterSetWithCharactersInString: @"0123456789abcdefABCDEF:. "] invertedSet]; staticResolvers = [[staticResolvers componentsSeparatedByCharactersInSet: charset] componentsJoinedByString: @" "]; sender.stringValue = staticResolvers; setenv("STATIC_RESOLVERS", [staticResolvers UTF8String], 1); [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./set-static-resolvers.sh \"$STATIC_RESOLVERS\"", nil]]; } - (BOOL) setQueryLoggingOn { [self showSpinners]; NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-query-logging-on.sh", nil]]; (void) res; return TRUE; } - (BOOL) setQueryLoggingOff { [self showSpinners]; NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-query-logging-off.sh", nil]]; (void) res; return TRUE; } - (IBAction)queryLoggingButtonPressed:(NSButtonCell *)sender { if (sender.state != 0) { [self setQueryLoggingOn]; } else { [self setQueryLoggingOff]; } } - (IBAction)viewLogButtonPushed:(NSButton *)sender { [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"open /Applications/Utilities/Console.app " kDNSCRYPT_QUERY_LOG_FILE " || open " kDNSCRYPT_QUERY_LOG_FILE, nil]]; } - (BOOL) updateBlacklistIPs { [self showSpinners]; NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./update-blacklist-ips.sh", nil]]; (void) res; return TRUE; } - (IBAction)blacklistIPsUpdated:(NSTextField *)sender { NSString *content = sender.stringValue; if ([content writeToFile: kDNSCRYPT_BLACKLIST_IPS_TMP_FILE atomically: YES encoding: NSUTF8StringEncoding error: nil] != YES) { return; } [self updateBlacklistIPs]; } - (BOOL) updateBlacklistDomains { [self showSpinners]; NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./update-blacklist-domains.sh", nil]]; (void) res; return TRUE; } - (IBAction)blacklistDomainsUpdated:(NSTextField *)sender { NSString *content = sender.stringValue; if ([content writeToFile: kDNSCRYPT_BLACKLIST_DOMAINS_TMP_FILE atomically: YES encoding: NSUTF8StringEncoding error: nil] != YES) { return; } [self updateBlacklistDomains]; } - (BOOL) updateExceptions { [self showSpinners]; NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./update-exceptions.sh", nil]]; (void) res; return TRUE; } - (IBAction)exceptionsUpdated:(NSTextField *)sender { NSString *content = sender.stringValue; if ([content writeToFile: kDNSCRYPT_EXCEPTIONS_TMP_FILE atomically: YES encoding: NSUTF8StringEncoding error: nil] != YES) { return; } [self updateExceptions]; } - (IBAction)helpButtonPressed:(NSButton *)sender { if (_helpWebView.isHidden) { [_helpWebView.window makeFirstResponder: nil]; [_helpWebView setHidden: NO]; [_helpWebView setAlphaValue: 0.0F]; [_helpWebView.animator setAlphaValue: 1.0F]; [_helpWebView setDrawsBackground: TRUE]; [_viewLogButton setHidden: YES]; [_queryLoggingButton setHidden: YES]; } else { [_helpWebView.window makeFirstResponder: nil]; [_helpWebView setHidden: YES]; [_queryLoggingButton setHidden: NO]; } } @end ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/en.lproj/DNSCrypt.xib ================================================ NSAllRomanInputSourcesLocaleIdentifier IP addresses (IPv4/IPv6) to block.

208.67.0.255
192.0.43.10 ::1 NSAllRomanInputSourcesLocaleIdentifier Domain names to block. 
*sex* ads.* *.example.com
suspicious.example.net NSAllRomanInputSourcesLocaleIdentifier NSAllRomanInputSourcesLocaleIdentifier ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/en.lproj/InfoPlist.strings ================================================ /* Localized versions of Info.plist keys */ ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/html/about.haml ================================================ !!! 5 %html{lang: "en"} %head %meta{charset: "utf-8"} %title About DNSCrypt-OSXClient %style{type: "text/css"} :sass body font: family: arial, helvetica, sans-serif margin: 0 h1 margin: 0 %body %h1 About DNSCrypt-OSXClient %p This software encrypts and authenticates DNS packets between your computer and a DNS resolver using DNSCrypt. %p Tips: %ul %li If you have a firewall, open TCP and UDP ports 53, 54, 443 and 1053. These are the most common ports used for DNSCrypt. %li The "Automatically disable if blocked" feature automatically disables DNSCrypt when DNS queries are not able to reach the DNSCrypt resolver. This can happen on public WiFi networks that require going through a captive portal before you can access external networks. This function is only provided for conveniency. When enabled, the protocol can be easily downgraded by third-parties. In other words, when the "Automatically disable if blocked" feature is enabled, this software doesn't provide any security at all against active attackers, but it can still be useful against passive attackers and in order to bypass DNS censorship. Don't enable it unless you are frequently roaming and you don't want to manually disable/enable DNSCrypt. %li Using Little Snitch? There are 4 rules you need to establish, which Little Snitch should prompt for when trying to activate this application: %ol %li Allow any outgoing connection for system processes (dnscrypt-proxy) %li Allow any incoming connection for system process (dnscrypt-proxy) %li Allow any outgoing connection for system processes (dig) %li Allow outgoing TCP connections on port 80( http) of www.apple.com for system process (curl) (Thanks to @cavemandaveman) ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/html/about.html ================================================ About DNSCrypt-OSXClient

About DNSCrypt-OSXClient

This software encrypts and authenticates DNS packets between your computer and a DNS resolver using DNSCrypt.

Tips:

  • If you have a firewall, open TCP and UDP ports 53, 54, 443 and 1053. These are the most common ports used for DNSCrypt.
  • The "Automatically disable if blocked" feature automatically disables DNSCrypt when DNS queries are not able to reach the DNSCrypt resolver. This can happen on public WiFi networks that require going through a captive portal before you can access external networks. This function is only provided for conveniency. When enabled, the protocol can be easily downgraded by third-parties. In other words, when the "Automatically disable if blocked" feature is enabled, this software doesn't provide any security at all against active attackers, but it can still be useful against passive attackers and in order to bypass DNS censorship. Don't enable it unless you are frequently roaming and you don't want to manually disable/enable DNSCrypt.
  • Using Little Snitch? There are 4 rules you need to establish, which Little Snitch should prompt for when trying to activate this application:
    1. Allow any outgoing connection for system processes (dnscrypt-proxy)
    2. Allow any incoming connection for system process (dnscrypt-proxy)
    3. Allow any outgoing connection for system processes (dig)
    4. Allow outgoing TCP connections on port 80( http) of www.apple.com for system process (curl)
    (Thanks to @cavemandaveman)

================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/html/help.haml ================================================ !!! 5 %html{lang: "en"} %head %meta{charset: "utf-8"} %title Help (advanced settings) %style{type: "text/css"} :sass html background: #e4e4e4 body font: family: arial, helvetica, sans-serif margin: 1em h1 margin: 0 %body %h1 Help (advanced settings) %section %h2 Static DNS servers %p If you are not using DHCP and want a statically configured set of default DNS resolvers, enter their IP addresses in this box. %p Separate them with spaces. %section %h2 Log DNS queries %p As a tool designed to protect your privacy, the DNSCrypt proxy does not log anything about your DNS queries. Nothing about them will be saved to disk ever, and log messages are intentionally kept as generic as possible. %p However, you still may want to look at the DNS queries sent by your system. This can be useful in order to spot suspicious activity and to refine your domain blacklists and whitelists. %p Checking the "Log DNS queries" box dumps all DNS queries sent by your computer to a file named /var/log/dnscrypt-query.log %p The "View log" button opens it with the log viewer application so that you can watch it in real time. %section %h2 IP addresses blocking %p A response to a query containing at least one IP address listed here will be blocked. %p This make it easy to block spam sources, hosting services and content providers using a lot of different domain names for a single service. %p This can also be useful in order to block DNS rebinding attacks, even for non-private network spaces. %p IP addresses can be IPv4 and IPv6 addresses, and must be separated with spaces. %section %h2 Names blocking %p This is a list of domain names to be blocked. %p "example.com" will only match this specific name, not "www.example.com". %p But wildcards are also supported. "*.example.com" will match any name ending with ".example.com" whereas "ads.*" will match any name beginning with "ads." %p Wildcards can also perform substring matching. "*xxx*" will match any name containing the string "xxx". %p Patterns to be blocked should be separated with spaces, and the blocking takes effect immediately after you hit the Return key. Flushing your DNS cache is not required. %p This feature is only enabled when using DNSCrypt. %section %h2 Exceptions - bypassing DNSCrypt for some specific names %p Some domain names should not be resolved by a third-party DNS resolver, that may not know about them. %p This includes local domain names provided by home routers (like "routerlogin.net"), local domain names provided by operating systems and applications (like ".local" or ".lan"), local domain names served by appliances like st-top boxes, and internal domains used in corporate networks. %p Domains listed here will bypass DNSCrypt in order to be sent to the default resolvers. %p Do %strong not use a tool like hostip(8), drill(1), unbound-host(1), dig(1) or host(1) in order to check that an exception rule works. %p These tools use their own resolution mechanisms that have nothing to do with how others apps on your system are resolving names. %p They don't use the OSX-specific stub resolver, they don't use the system-wide DNS cache, they have bugs and limitations that the OS doesn't have (and the opposite is also true), and they don't know a thing about specific resolvers that have to be used for specific domains. %p Use actual apps, or even a command like ping(8). ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/html/help.html ================================================ Help (advanced settings)

Help (advanced settings)

Static DNS servers

If you are not using DHCP and want a statically configured set of default DNS resolvers, enter their IP addresses in this box.

Separate them with spaces.

Log DNS queries

As a tool designed to protect your privacy, the DNSCrypt proxy does not log anything about your DNS queries. Nothing about them will be saved to disk ever, and log messages are intentionally kept as generic as possible.

However, you still may want to look at the DNS queries sent by your system. This can be useful in order to spot suspicious activity and to refine your domain blacklists and whitelists.

Checking the "Log DNS queries" box dumps all DNS queries sent by your computer to a file named /var/log/dnscrypt-query.log

The "View log" button opens it with the log viewer application so that you can watch it in real time.

IP addresses blocking

A response to a query containing at least one IP address listed here will be blocked.

This make it easy to block spam sources, hosting services and content providers using a lot of different domain names for a single service.

This can also be useful in order to block DNS rebinding attacks, even for non-private network spaces.

IP addresses can be IPv4 and IPv6 addresses, and must be separated with spaces.

Names blocking

This is a list of domain names to be blocked.

"example.com" will only match this specific name, not "www.example.com".

But wildcards are also supported. "*.example.com" will match any name ending with ".example.com" whereas "ads.*" will match any name beginning with "ads."

Wildcards can also perform substring matching. "*xxx*" will match any name containing the string "xxx".

Patterns to be blocked should be separated with spaces, and the blocking takes effect immediately after you hit the Return key. Flushing your DNS cache is not required.

This feature is only enabled when using DNSCrypt.

Exceptions - bypassing DNSCrypt for some specific names

Some domain names should not be resolved by a third-party DNS resolver, that may not know about them.

This includes local domain names provided by home routers (like "routerlogin.net"), local domain names provided by operating systems and applications (like ".local" or ".lan"), local domain names served by appliances like st-top boxes, and internal domains used in corporate networks.

Domains listed here will bypass DNSCrypt in order to be sent to the default resolvers.

Do not use a tool like hostip(8), drill(1), unbound-host(1), dig(1) or host(1) in order to check that an exception rule works.

These tools use their own resolution mechanisms that have nothing to do with how others apps on your system are resolving names.

They don't use the OSX-specific stub resolver, they don't use the system-wide DNS cache, they have bugs and limitations that the OS doesn't have (and the opposite is also true), and they don't know a thing about specific resolvers that have to be used for specific domains.

Use actual apps, or even a command like ping(8).

================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/html/releasenotes.haml ================================================ !!! 5 %html{lang: "en"} %head %meta{charset: "utf-8"} %title Release notes for DNSCrypt-OSXClient by AlterStep %style{type: "text/css"} :sass body font: family: arial, helvetica, sans-serif margin: 0 h1, h2 margin: 0 h1 border-bottom: 1px solid grey article padding-left: 1em time font: style: italic %body %h1 Release Notes for DNSCrypt-OSXclient by AlterStep %article %h2 Version 1.0.4 by AlterStep %time Thu, 19 Sep 2014 %p Updated DNSCrypt proxy to version 1.4.1 %p Updated libsodium to 0.7.0-minimal %article %h2 Version 1.0.3 by AlterStep %time Thu, 18 Jun 2014 %p Runs on OSX 10.8 (Snow Leopard), 10.9 (Mavericks) and 10.10 (Yosemite) %p New set of icons, contributed by Aaron VonderHaar %article %h2 Version 1.0.2 by AlterStep %time Thu, 05 Jun 2014 %p Improved installation scripts %p LDNS has been downgraded in order to work on systems without Homebrew. %article %h2 Version 1.0.1 by AlterStep %time Mon, 28 Apr 2014 %p Include the release version of dnscrypt-proxy 1.4, with a new OpenNIC resolver. %p Wait after dnscrypt-proxy has been turned on before sending a query. This actually makes state changes faster. %p Debug log, turned off by default and deleted after every reboot. In order to enable it, create an empty file named %code debug.enabled in %code /Library/Application Support/DNSCrypt/control and the debug log file itself is %code /var/log/dnscrypt-osxclient-debug.log %p Thanks a lot for your feedback on the first version! %article %h2 Version 1.0.0 by AlterStep %time Thu, 21 Apr 2014 %p This is my first release, based on the source code of the beta version written by OpenDNS. %p It has only been tested on OSX 10.9. %p It includes dnscrypt-proxy 1.4.0, libsodium 0.4.5, libldns 1.6.17. %p Contact me on Github: https://github.com/alterstep/dnscrypt-osx-client ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/html/releasenotes.html ================================================ Release notes for DNSCrypt-OSXClient by AlterStep

Release Notes for DNSCrypt-OSXclient by AlterStep

Version 1.0.4 by AlterStep

Updated DNSCrypt proxy to version 1.4.1

Updated libsodium to 0.7.0-minimal

Version 1.0.3 by AlterStep

Runs on OSX 10.8 (Snow Leopard), 10.9 (Mavericks) and 10.10 (Yosemite)

New set of icons, contributed by Aaron VonderHaar

Version 1.0.2 by AlterStep

Improved installation scripts

LDNS has been downgraded in order to work on systems without Homebrew.

Version 1.0.1 by AlterStep

Include the release version of dnscrypt-proxy 1.4, with a new OpenNIC resolver.

Wait after dnscrypt-proxy has been turned on before sending a query. This actually makes state changes faster.

Debug log, turned off by default and deleted after every reboot. In order to enable it, create an empty file named debug.enabled in /Library/Application Support/DNSCrypt/control and the debug log file itself is /var/log/dnscrypt-osxclient-debug.log

Thanks a lot for your feedback on the first version!

Version 1.0.0 by AlterStep

This is my first release, based on the source code of the beta version written by OpenDNS.

It has only been tested on OSX 10.9.

It includes dnscrypt-proxy 1.4.0, libsodium 0.4.5, libldns 1.6.17.

Contact me on Github: https://github.com/alterstep/dnscrypt-osx-client

================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/bin/Uninstall.app/Contents/Info.plist ================================================ CFBundleAllowMixedLocalizations CFBundleDevelopmentRegion English CFBundleExecutable applet CFBundleIconFile applet CFBundleIdentifier com.apple.ScriptEditor.id.Uninstall CFBundleInfoDictionaryVersion 6.0 CFBundleName Uninstall CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature aplt LSMinimumSystemVersionByArchitecture x86_64 10.6 LSRequiresCarbon WindowState dividerCollapsed eventLogLevel -1 name ScriptWindowState positionOfDivider 370 savedFrame 85 77 1202 655 0 0 1366 746 selectedTabView result ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/bin/Uninstall.app/Contents/PkgInfo ================================================ APPLaplt ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/bin/Uninstall.app/Contents/Resources/description.rtfd/TXT.rtf ================================================ {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf200 {\fonttbl} {\colortbl;\red255\green255\blue255;} } ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/afterboot.sh ================================================ #! /bin/sh . ./common.inc rm -f "$QUERY_LOG_FILE" rm -f "$DEBUG_LOG_FILE" ./clear-fw.sh exec ./handle-control-change.sh --boot ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/check-hijacking.sh ================================================ #! /bin/sh . ./common.inc try_resolution() { exec alarmer 5 dig +tries=2 +time=3 +short google-public-dns-a.google.com \ | egrep '^8[.]8[.]8[.]8' > /dev/null 2>&1 } try_http_query() { exec alarmer 5 curl -L --max-redirs 5 -4 -m 5 \ http://www.apple.com 2>/dev/null | \ fgrep -c Apple > /dev/null 2>&1 } try_everything() { try_resolution & resolution_pid=$! try_http_query & http_query_pid=$! wait $resolution_pid resolution_ret=$? if [ $resolution_ret != 0 ]; then return 1 fi wait $http_query_pid http_query_ret=$? [ $resolution_ret = 0 -a $http_query_ret = 0 ] } try_everything_with_retries() { try_everything || try_everything } try_everything_with_retries ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/check-local-dns.sh ================================================ #! /bin/sh . ./common.inc try_local_resolution() { exec dig +tries=2 +time=3 +short google-public-dns-a.google.com @$INTERFACE_PROXY \ | egrep '^8[.]8[.]8[.]8' > /dev/null 2>&1 } try_local_resolution ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/check-network-change.sh ================================================ #! /bin/sh . ./common.inc NETWORK_STATE_FILE="${STATES_DIR}/network-state" DHCP_DNS_FILE="${STATES_DIR}/dhcp-dns" AIRPORT_TOOL="/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport" mkdir -p "$STATES_DIR" || exit 1 ips=$(./get-dhcp-resolvers.sh) echo "$ips" > "$DHCP_DNS_FILE" ssid=$("$AIRPORT_TOOL" -I 2>&1 | fgrep '[^B]SSID: ') bssid=$("$AIRPORT_TOOL" -I 2>&1 | fgrep 'BSSID: ') if [ -f "$NETWORK_STATE_FILE" ]; then if echo "$ifs $ips $ssid $bssid" | \ cmp -- "$NETWORK_STATE_FILE" - >/dev/null; then exit 1 fi fi echo "$ifs $ips $ssid $bssid" > "$NETWORK_STATE_FILE" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/clear-fw.sh ================================================ #! /bin/sh . ./common.inc exec >/dev/null exec 2>&1 SOCKETFILTERFW='/usr/libexec/ApplicationFirewall/socketfilterfw' [ -x "$SOCKETFILTERFW" ] || exit 0 "$SOCKETFILTERFW" --add /usr/local/sbin/dnscrypt-proxy "$SOCKETFILTERFW" --unblockapp /usr/local/sbin/dnscrypt-proxy "$SOCKETFILTERFW" --add /usr/local/bin/hostip "$SOCKETFILTERFW" --unblockapp /usr/local/bin/hostip ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/common.inc ================================================ DNSCRYPT_USR_BASE_DIR='/Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr' DNSCRYPT_VAR_BASE_DIR='/Library/Application Support/DNSCrypt' DNSCRYPT_LOG_BASE_DIR='/var/log' DNSCRYPT_VAR_RUN_BASE_DIR='/var/run' cd -- "${DNSCRYPT_USR_BASE_DIR}/scripts" || exit 1 CONTROL_DIR="${DNSCRYPT_VAR_BASE_DIR}/control" TICKETS_DIR="${DNSCRYPT_VAR_BASE_DIR}/tickets" DNSCRYPT_PROXY_BASE_DIR="${DNSCRYPT_VAR_BASE_DIR}/dnscrypt-proxy" PROXY_PID_FILE="${DNSCRYPT_VAR_RUN_BASE_DIR}/dnscrypt-proxy.pid" STATES_DIR="${DNSCRYPT_VAR_BASE_DIR}/states" DNSCRYPT_RESOLVER_NAME_FILE="${CONTROL_DIR}/dnscrypt-resolver-name" DNSCRYPT_FILE="${CONTROL_DIR}/dnscrypt" FALLBACK_FILE="${CONTROL_DIR}/fallback" HANDLERS_LOCK_FILE="${DNSCRYPT_VAR_RUN_BASE_DIR}/dnscrypt-handlers.lock" DNSCRYPT_PROXY_PLUGINS_BASE_FILE="${CONTROL_DIR}/plugin" STATIC_RESOLVERS_FILE="${CONTROL_DIR}/static-resolvers" DEBUG_ENABLED_FILE="${CONTROL_DIR}/debug.enabled" PLUGINS_ENABLED_FILE="${CONTROL_DIR}/plugins.enabled" QUERY_LOGGING_FILE="${CONTROL_DIR}/plugin-query-logging.enabled" BLOCKING_FILE="${CONTROL_DIR}/plugin-blocking.enabled" QUERY_LOG_FILE="${DNSCRYPT_LOG_BASE_DIR}/dnscrypt-query.log" DEBUG_LOG_FILE="${DNSCRYPT_LOG_BASE_DIR}/dnscrypt-osxclient-debug.log" DEBUG_LOG_FILE_LOCK="${DEBUG_LOG_FILE}.lock" BLACKLIST_IPS_FILE="${CONTROL_DIR}/blacklist-ips" BLACKLIST_IPS_TMP_FILE="${BLACKLIST_IPS_FILE}.tmp" BLACKLIST_DOMAINS_FILE="${CONTROL_DIR}/blacklist-domains" BLACKLIST_DOMAINS_TMP_FILE="${BLACKLIST_DOMAINS_FILE}.tmp" EXCEPTIONS_FILE="${CONTROL_DIR}/exceptions" EXCEPTIONS_TMP_FILE="${EXCEPTIONS_FILE}.tmp" DEFAULT_RESOLVER_NAME='opendns' INTERFACE_UNBOUND="127.0.0.53" INTERFACE_UNBOUND_MASK="24" INTERFACE_PROXY="127.0.0.54" INTERFACE_PROXY_MASK="24" INTERFACE_PROBES="127.0.0.55" INTERFACE_PROBES_MASK="24" DOMAINS_EXCEPTIONS=' freebox.fr fritz.box intranet lan localdomain nowtv.com private routerlogin.net l ' DISABLE_IPV6='no' export PATH="${DNSCRYPT_USR_BASE_DIR}/bin:${DNSCRYPT_USR_BASE_DIR}/scripts:$PATH" init_interfaces() { /sbin/ifconfig lo0 alias ${INTERFACE_UNBOUND}/${INTERFACE_UNBOUND_MASK} /sbin/ifconfig lo0 alias ${INTERFACE_PROXY}/${INTERFACE_PROXY_MASK} /sbin/ifconfig lo0 alias ${INTERFACE_PROBES}/${INTERFACE_PROBES_MASK} } logger_debug() { [ -f "$DEBUG_ENABLED_FILE" ] || return lockfile -1 -r 1 "$DEBUG_LOG_FILE_LOCK" > /dev/null 2>&1 echo "$(date) - $1" >> "$DEBUG_LOG_FILE" rm -f "$DEBUG_LOG_FILE_LOCK" 2> /dev/null } ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/create-ticket.sh ================================================ #! /bin/sh . ./common.inc ticket_file=$(mktemp "$TICKETS_DIR/ticket-XXXXXXXXXX") [ -e "$ticket_file" ] || exit 1 basename "$ticket_file" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/exceptions-add.sh ================================================ #! /bin/sh RESOLVER_DIR='/etc/resolver' . ./common.inc [ -r "$EXCEPTIONS_FILE" ] && DOMAINS_EXCEPTIONS="$(cat "$EXCEPTIONS_FILE") $DOMAINS_EXCEPTIONS" get_gw() { route -n get default | while read line; do case "$line" in gateway:\ *) echo "$line" | sed 's/ *gateway: *//' return ;; esac done } get_dhcp_dns() { cat "${STATES_DIR}/dhcp-dns" 2> /dev/null } remove_old_exceptions() { local found find -x "$RESOLVER_DIR" -type f -print | { while read file; do found='no' for domain in $DOMAINS_EXCEPTIONS; do [ "$file" = "${RESOLVER_DIR}/${domain}" ] && found='yes' && break done [ "$found" = 'no' ] || continue fgrep -ci 'automatically generated by the dnscrypt user interface' \ $file > /dev/null 2>&1 || continue rm -f "$file" done } } name_servers=$(./get-static-resolvers.sh || get_dhcp_dns || get_gw) [ x"$name_servers" = 'x' ] && exit 0 default_domain=$(./get-current-default-domain.sh) mkdir -p "$RESOLVER_DIR" || exit 1 remove_old_exceptions name_server="$gw" for domain in $DOMAINS_EXCEPTIONS; do if [ x"$default_domain" != 'x' ]; then echo "$domain" | grep -c ".*${default_domain}" > /dev/null [ $? = 0 ] && continue fi echo '# automatically generated by the dnscrypt user interface' \ > "${RESOLVER_DIR}/${domain}" for name_server in $name_servers; do echo "nameserver ${name_server}" >> "${RESOLVER_DIR}/${domain}" done done exit 0 ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/exceptions-remove.sh ================================================ #! /bin/sh RESOLVER_DIR='/etc/resolver' . ./common.inc [ -r "$EXCEPTIONS_FILE" ] && DOMAINS_EXCEPTIONS="$(cat "$EXCEPTIONS_FILE") $DOMAINS_EXCEPTIONS" for domain in $DOMAINS_EXCEPTIONS; do rm -f "${RESOLVER_DIR}/${domain}" done exit 0 ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-current-default-domain.sh ================================================ #! /bin/ksh . ./common.inc [ -r /etc/resolv.conf ] || exit 0 domain="" while read line; do case "$line" in domain\ *) domain=$(echo "$line" | sed -e 's/domain *//' -e 's/ *//') break ;; esac done < /etc/resolv.conf echo "$domain" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-current-resolvers.sh ================================================ #! /bin/ksh . ./common.inc [ -r /etc/resolv.conf ] || exit 0 ips_i="" while read line; do case "$line" in nameserver\ *) ip=$(echo "$line" | sed -e 's/nameserver *//' -e 's/ *//') ips_i="$ips_i $ip" ;; esac done < /etc/resolv.conf typeset -A found ips="" for ip_i in $ips_i; do if [ ! ${found["$ip_i"]} ]; then if [ "$ips" ]; then ips="$ips " fi ips="$ips$ip_i" found["$ip_i"]=1 fi done echo "$ips" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-dhcp-resolvers.sh ================================================ #! /bin/ksh . ./common.inc ifs=$(ifconfig -a | \ awk '/^[^ :]*:/ { sub(/:.*$/,empty); iface=$0 } /status: active/ { print iface }') ifs=$(echo $ifs) typeset -A found ips="" for i in $ifs; do ips_i=$(ipconfig getpacket "$i" 2> /dev/null | fgrep 'domain_name_server' | \ sed -e 's/^.*{//' -e 's/,/ /g' -e 's/}//' ) for ip_i in $ips_i; do if [ ! ${found["$ip_i"]} ]; then if [ "$ips" ]; then ips="$ips " fi ips="$ips$ip_i" found["$ip_i"]=1 fi done done echo "$ips" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-dnscrypt-resolver-name.sh ================================================ #! /bin/sh . ./common.inc [ -r "$DNSCRYPT_RESOLVER_NAME_FILE" ] && \ sed 's/[^a-zA-Z0-9.-]/_/g' < "$DNSCRYPT_RESOLVER_NAME_FILE" && exit 0 echo "$DEFAULT_RESOLVER_NAME" exit 0 ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-dnscrypt-status.sh ================================================ #! /bin/sh . ./common.inc if [ -e "$DNSCRYPT_FILE" ]; then echo 'yes' else echo 'no' fi ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-fallback-status.sh ================================================ #! /bin/sh . ./common.inc if [ -e "$FALLBACK_FILE" ]; then echo 'yes' else echo 'no' fi ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-query-logging-status.sh ================================================ #! /bin/sh . ./common.inc if [ -e "$QUERY_LOGGING_FILE" ]; then echo 'yes' else echo 'no' fi ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-resolvers-description.sh ================================================ #! /bin/sh . ./common.inc if [ -e "${STATES_DIR}/updating" ]; then echo 'Updating' exit 0 fi name='None' level=0 while read resolver; do case "$resolver" in 127.0.0.5*) if [ $level -le 80 ]; then name='DNSCrypt' level=80 fi ;; 127.0.0.1) if [ $level -le 20 ]; then name='Localhost' level=20 fi ;; ::1) if [ $level -le 30 ]; then name='Localhost IPv6' level=30 fi ;; *) if [ $level -le 10 ]; then name='Default' level=10 fi ;; esac done echo "$name" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-static-resolvers.sh ================================================ #! /bin/sh . ./common.inc [ -r "$STATIC_RESOLVERS_FILE" ] && cat "$STATIC_RESOLVERS_FILE" && exit 0 exit 1 ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-tickets-count.sh ================================================ #! /bin/sh . ./common.inc exec find "$TICKETS_DIR" -type f -name 'ticket-*' | wc -l | sed 's/ *//g' ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-upstream-resolvers.sh ================================================ #! /bin/sh . ./common.inc dnscrypt_proxy_used='no' upstream_resolvers='' while read resolver; do case "$resolver" in 127.0.0.5*) dnscrypt_proxy_used='yes' ;; esac if [ x"$upstream_resolvers" = 'x' ]; then upstream_resolvers="$resolver" else upstream_resolvers="${upstream_resolvers} $resolver" fi done if [ "$dnscrypt_proxy_used" = 'yes' \ -a -r "${STATES_DIR}/dnscrypt-proxy-description" ]; then cat "${STATES_DIR}/dnscrypt-proxy-description" && exit 0 fi echo "$upstream_resolvers" exit 0 ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/gui-pop-conf-change.sh ================================================ #! /bin/sh . ./common.inc [ $# != 1 ] && exit 1 pname="$1" case "$pname" in menubar) ;; prefpane) ;; *) exit 1;; esac changed='no' if [ -e "${TICKETS_DIR}/gui-change-${pname}" ]; then rm -f "${TICKETS_DIR}/gui-change-${pname}" changed='yes' fi echo "$changed" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/gui-push-conf-change.sh ================================================ #! /bin/sh . ./common.inc [ $# != 1 ] && exit 1 pname="$1" case "$pname" in menubar) ;; prefpane) ;; *) exit 1;; esac touch "${TICKETS_DIR}/gui-change-${pname}" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/handle-console-change.sh ================================================ #! /bin/sh . ./common.inc eval $(stat -s '/dev/console') || exit 1 logger_debug "OSX console ownership changed" wanted_uid="$st_uid" if [ ! -d "$DNSCRYPT_VAR_BASE_DIR" ]; then mkdir -p "$DNSCRYPT_VAR_BASE_DIR" || exit 1 chown -R 0:0 "$DNSCRYPT_VAR_BASE_DIR" chmod 755 "$DNSCRYPT_VAR_BASE_DIR" fi mkdir -m 755 -p "$TICKETS_DIR" || exit 1 chown -R "${wanted_uid}:0" "$TICKETS_DIR" eval $(stat -s "$CONTROL_DIR") || exit 1 if [ $? != 0 ]; then mkdir -m 755 -p "$CONTROL_DIR" || exit 1 current_uid='nonexistent' else current_uid="$st_uid" fi [ x"$current_uid" != x"$wanted_uid" ] && \ chown -R "${wanted_uid}:0" "$CONTROL_DIR" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/handle-control-change.sh ================================================ #! /bin/sh . ./common.inc PROCESSED_TICKETS_FILE="${STATES_DIR}/processed-tickets" update() { lockfile -1 -r 30 "$HANDLERS_LOCK_FILE" || exit 1 if [ -e "$DNSCRYPT_FILE" ]; then ./switch-to-dnscrypt-if-required.sh else ./stop-dnscrypt-proxy.sh ./switch-to-dhcp-if-required.sh fi rm -f "$HANDLERS_LOCK_FILE" } touch "${STATES_DIR}/updating" logger_debug "DNSCrypt-OSXClient configuration changed" updated='no' while :; do find "$TICKETS_DIR" -type f -name 'ticket-*' > "$PROCESSED_TICKETS_FILE" if [ ! -s "$PROCESSED_TICKETS_FILE" -a "$updated" = 'yes' ]; then break fi update updated='yes' while read ticket_file; do rm -f "$ticket_file" done < "$PROCESSED_TICKETS_FILE" done rm -f "${STATES_DIR}/updating" rm -f "${STATES_DIR}/update-request" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/handle-network-change.sh ================================================ #! /bin/sh . ./common.inc tickets_count=$(./get-tickets-count.sh) [ "$tickets_count" != '0' ] && exit 0 if [ x"$1" != 'x--boot' ]; then [ ! -e "$FALLBACK_FILE" ] && exit 0 ./check-network-change.sh || exit 0 fi logger_debug "Network configuration changed" lockfile -1 -r 30 "$HANDLERS_LOCK_FILE" || exit 1 ./set-dns-to-dhcp.sh if [ ! -e "$DNSCRYPT_FILE" ]; then rm -f "$HANDLERS_LOCK_FILE" exit 0 fi ./switch-to-dnscrypt-if-required.sh rm -f "$HANDLERS_LOCK_FILE" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/set-dns-to-dhcp.sh ================================================ #! /bin/sh . ./common.inc servers='empty' logger_debug "Changing the DNS configuration to use the default DNS resolvers" if [ -r "$STATIC_RESOLVERS_FILE" ]; then servers='' while read server; do case "$server" in [0-9a-fA-F:.]*) servers="${servers} ${server}" ;; esac done < "$STATIC_RESOLVERS_FILE" [ -z "$servers" ] && servers='empty' logger_debug "Static list of DNS resolvers: [$servers]" fi exec networksetup -listallnetworkservices 2>/dev/null | \ fgrep -v '*' | while read x ; do networksetup -setdnsservers "$x" $servers > /dev/null done logger_debug "Flushing the local DNS cache" dscacheutil -flushcache 2> /dev/null killall -HUP mDNSResponder 2> /dev/null exit 0 ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/set-dns.sh ================================================ #! /bin/sh . ./common.inc servers="$*" [ $# -lt 1 ] && exit 1 logger_debug "Setting DNS resolvers to [$servers]" exec networksetup -listallnetworkservices 2>/dev/null | \ fgrep -v '*' | while read x ; do networksetup -setdnsservers "$x" $servers done logger_debug "Flushing local DNS cache" dscacheutil -flushcache 2> /dev/null killall -HUP mDNSResponder 2> /dev/null exit 0 ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/set-dnscrypt-resolver-name.sh ================================================ #! /bin/sh . ./common.inc [ $# -lt 1 ] && exit 1 resolver_name="$1" if [ "$resolver_name" = "" ]; then rm -f "$DNSCRYPT_RESOLVER_NAME_FILE" else echo "$resolver_name" | sed 's/^ *//;s/ *$//' \ > "$DNSCRYPT_RESOLVER_NAME_FILE" fi ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/set-static-resolvers.sh ================================================ #! /bin/sh . ./common.inc args="$*" [ $# -lt 1 ] && exit 1 servers='' for server in $args; do servers="${servers} ${server}" done if [ "$servers" = "" ]; then rm -f "$STATIC_RESOLVERS_FILE" else echo "$servers" | sed 's/^ *//;s/ *$//' > "$STATIC_RESOLVERS_FILE" fi ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/start-dnscrypt-proxy.sh ================================================ #! /bin/sh . ./common.inc DNSCRYPT_LIB_BASE_DIR="${DNSCRYPT_USR_BASE_DIR}/lib" export DYLD_LIBRARY_PATH="${DNSCRYPT_LIB_BASE_DIR}:${DYLD_LIBRARY_PATH}" init_interfaces mkdir -p -- "$DNSCRYPT_VAR_BASE_DIR" || exit 1 PROBES_BASE_DIR="${DNSCRYPT_VAR_BASE_DIR}/probes" rm -fr "$PROBES_BASE_DIR" || exit 1 mkdir -p -- "$PROBES_BASE_DIR" || exit 1 RES_DIR="${PROBES_BASE_DIR}/results" || exit 1 mkdir -p -- "$RES_DIR" || exit 1 DESCRIPTIONS_DIR="${PROBES_BASE_DIR}/results-descriptions" || exit 1 mkdir -p -- "$DESCRIPTIONS_DIR" || exit 1 PID_DIR="${PROBES_BASE_DIR}/pids" || exit 1 mkdir -p -- "$PID_DIR" || exit 1 RESOLVER_NAME=$(./get-dnscrypt-resolver-name.sh) || exit 1 try_resolver() { local priority="$1" shift local description="$1" shift local args="$*" local pid_file="${PID_DIR}/${priority}.pid" logger_debug "Running a test dnscrypt proxy for [$description]" rm -f "${RES_DIR}/${priority}" exec alarmer 3 dnscrypt-proxy --pid="$pid_file" \ --resolver-name="$RESOLVER_NAME" \ --local-address="${INTERFACE_PROBES}:${priority}" $args 2>&1 | \ while read line; do case "$line" in *Proxying\ from\ *) logger_debug "Proxy for [$description] is up" answers=$(exec dig +time=1 +short +tries=2 -p $priority \ @"$INTERFACE_PROBES" www.apple.com. 2> /dev/null | \ egrep -ic '^[0-9.:]+$') [ -r "$pid_file" ] && kill $(cat -- "$pid_file") if [ $answers -gt 0 ]; then logger_debug "Proxy for [$description] can be used" echo "$args" > "${RES_DIR}/${priority}" echo "$description" > "${DESCRIPTIONS_DIR}/${priority}" fi ;; *) ;; esac done } get_plugin_args() { cat "$DNSCRYPT_PROXY_PLUGINS_BASE_FILE"[s-]*.enabled | { \ local plugin_args='' local quoted_line while read line; do case "$line" in libdcplugin_*) plugin_args="${plugin_args} --plugin=${line}" ;; esac done logger_debug "Plugins to be used: [$plugin_args]" echo "$plugin_args" } } logger_debug "dnscrypt-proxy should be (re)started, stopping previous instance if needed" ./stop-dnscrypt-proxy.sh ipv6_supported="no" if [ x"$DISABLE_IPV6" = "xno" ]; then logger_debug "Testing IPv6 connectivity" ping6 -c 1 2620:0:ccc::2 > /dev/null 2>&1 if [ $? = 0 ]; then ipv6_supported="yes" logger_debug "IPv6 connectivity detected" else logger_debug "IPv6 connectivity is not available" fi fi wait_pids="" try_resolver 5004 "${RESOLVER_NAME} using DNSCrypt over UDP" \ "--resolver-name=$RESOLVER_NAME" & wait_pids="$wait_pids $!" try_resolver 5005 "${RESOLVER_NAME} using DNSCrypt over TCP" \ "--resolver-name=$RESOLVER_NAME --tcp-only" & wait_pids="$wait_pids $!" for pid in $wait_pids; do wait $pid best_file=$(ls "$RES_DIR" | head -n 1) [ x"$best_file" != "x" ] && break done if [ x"$best_file" = "x" ]; then logger_debug "No usable proxy configuration has been found" exit 1 fi plugins_args='' if [ -r "${DNSCRYPT_PROXY_PLUGINS_BASE_FILE}s.enabled" ]; then plugin_args=$(get_plugin_args) fi [ "$ipv6_supported" = "no" ] && \ plugin_args="${plugin_args} --plugin=libdcplugin_example_ldns_aaaa_blocking.la" best_args=$(cat "${RES_DIR}/${best_file}") logger_debug "Starting dnscrypt-proxy $best_args" eval dnscrypt-proxy $best_args --local-address="$INTERFACE_PROXY" \ --resolver-name="$RESOLVER_NAME" \ --pidfile="$PROXY_PID_FILE" --user=daemon --daemonize $plugin_args if [ $? != 0 ]; then [ -r "$PROXY_PID_FILE" ] && kill $(cat -- "$PROXY_PID_FILE") logger_debug "dnscrypt-proxy $best_args command failed, retrying" sleep 1 killall dnscrypt-proxy sleep 1 rm -f "$PROXY_PID_FILE" killall -9 dnscrypt-proxy sleep 1 eval dnscrypt-proxy $best_args --local-address="$INTERFACE_PROXY" \ --resolver-name="$RESOLVER_NAME" \ --pidfile="$PROXY_PID_FILE" --user=daemon --daemonize $plugin_args || \ exit 1 logger_debug "dnscrypt-proxy $best_args worked after a retry" fi sleep 1 logger_debug "Checking if the current configuration hijacks all DNS queries" i=0 while [ $i -lt 30 ]; do ./check-local-dns.sh && break sleep 0.1 i=$((i + 1)) done if [ $i -ge 30 ]; then logger_debug "Current configuration hijacks all DNS queries, disabling DNSCrypt" ./switch-to-dhcp.sh exit 1 fi logger_debug "Current configuration doesn't seem to hijack all DNS queries" mv "${DESCRIPTIONS_DIR}/${best_file}" \ "${STATES_DIR}/dnscrypt-proxy-description" 2>/dev/null || exit 0 ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/stop-dnscrypt-proxy.sh ================================================ #! /bin/sh . ./common.inc logger_debug "Stopping dnscrypt-proxy" if [ -x /usr/bin/pgrep ]; then pgrep -x dnscrypt-proxy | egrep '[0-9]+' > /dev/null || exit 0 fi [ ! -r "$PROXY_PID_FILE" ] && exit 0 pid=$(cat "$PROXY_PID_FILE") [ $pid -lt 2 ] && exit 0 logger_debug "Trying to stop dnscrypt-proxy by killing pid [$pid]" kill $pid i=0 while [ $i -lt 30 ]; do [ ! -r "$PROXY_PID_FILE" ] && exit 0 sleep 0.1 i=$((i + 1)) done rm -f "$PROXY_PID_FILE" kill -9 $pid logger_debug "Killed dnscrypt-proxy with kill -9 pid [$pid]" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-blacklists-off.sh ================================================ #! /bin/sh . ./common.inc exec rm -f "$BLOCKING_FILE" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-blacklists-on.sh ================================================ #! /bin/sh . ./common.inc plugin_args='' [ -s "$BLACKLIST_IPS_FILE" ] && \ plugin_args="${plugin_args},--ips='${BLACKLIST_IPS_FILE}'" [ -s "$BLACKLIST_DOMAINS_FILE" ] && \ plugin_args="${plugin_args},--domains='${BLACKLIST_DOMAINS_FILE}'" [ -z "$plugin_args" ] && exec ./switch-blacklists-off.sh echo "libdcplugin_example_ldns_blocking.la${plugin_args}" > \ "$BLOCKING_FILE" touch "$PLUGINS_ENABLED_FILE" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-fallback-off.sh ================================================ #! /bin/sh . ./common.inc rm -f "$FALLBACK_FILE" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-fallback-on.sh ================================================ #! /bin/sh . ./common.inc touch "$FALLBACK_FILE" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-query-logging-off.sh ================================================ #! /bin/sh . ./common.inc rm -f "$QUERY_LOGGING_FILE" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-query-logging-on.sh ================================================ #! /bin/sh . ./common.inc echo "libdcplugin_example_logging.la,${QUERY_LOG_FILE}" > \ "$QUERY_LOGGING_FILE" touch "$PLUGINS_ENABLED_FILE" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-to-dhcp-if-required.sh ================================================ #! /bin/sh . ./common.inc [ -e "$DNSCRYPT_FILE" ] && exit 0 ./exceptions-remove.sh exec ./set-dns-to-dhcp.sh ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-to-dhcp.sh ================================================ #! /bin/sh . ./common.inc rm -f "$DNSCRYPT_FILE" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-to-dnscrypt-if-required.sh ================================================ #! /bin/ksh . ./common.inc PAUSE_MAX=10 PAUSE_INCREMENT=0.1 [ ! -e "$DNSCRYPT_FILE" ] && exit 0 logger_debug "DNSCrypt has been requested" ./set-dns-to-dhcp.sh pause=0 while [ -e "$DNSCRYPT_FILE" ]; do logger_debug "Switching to dnscrypt if required (pause=$pause)" current_resolvers=$(./get-current-resolvers.sh) if [ "$current_resolvers" = "$INTERFACE_PROXY" ]; then if [ ! -e "$PROXY_PID_FILE" ]; then logger_debug "The proxy should be running but it isn't." ./switch-to-dhcp.sh fi fi if [ $pause -lt $PAUSE_MAX ]; then pause=$((pause + $PAUSE_INCREMENT)) fi sleep $pause logger_debug "Checking if the router hijacks HTTP queries" if ./check-hijacking.sh; then logger_debug "The router doesn't hijack HTTP queries" else logger_debug "The router hijacks HTTP queries - DNSCrypt is likely to be blocked" continue fi ./start-dnscrypt-proxy.sh ./check-local-dns.sh || continue ./set-dns.sh "$INTERFACE_PROXY" if [ $? != 0 ]; then logger_debug "Setting the DNS to [$INTERFACE_PROXY] didn't work" ./set-dns-to-dhcp.sh continue fi ./check-hijacking.sh if [ $? != 0 ]; then logger_debug "Current configuration seems to be hijacking HTTP queries. Reverting to default resolvers." ./set-dns-to-dhcp.sh continue fi break done if [ ! -e "$DNSCRYPT_FILE" ]; then touch "$CONTROL_DIR" fi exec ./exceptions-add.sh ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-to-dnscrypt.sh ================================================ #! /bin/sh . ./common.inc touch "$DNSCRYPT_FILE" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/update-blacklist-domains.sh ================================================ #! /bin/sh . ./common.inc if [ ! -s "$BLACKLIST_DOMAINS_TMP_FILE" ]; then rm -f "$BLACKLIST_DOMAINS_FILE" "$BLACKLIST_DOMAINS_TMP_FILE" exec ./switch-blacklists-on.sh fi tr -s '[:blank:]' '\n' < "$BLACKLIST_DOMAINS_TMP_FILE" | \ egrep -vi '^(apple[.]com|resolver1[.]opendns[.]com)$' > \ "${BLACKLIST_DOMAINS_TMP_FILE}~" && mv "${BLACKLIST_DOMAINS_TMP_FILE}~" "$BLACKLIST_DOMAINS_FILE" exec ./switch-blacklists-on.sh ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/update-blacklist-ips.sh ================================================ #! /bin/sh . ./common.inc if [ ! -s "$BLACKLIST_IPS_TMP_FILE" ]; then rm -f "$BLACKLIST_IPS_FILE" "$BLACKLIST_IPS_TMP_FILE" exec ./switch-blacklists-on.sh fi tr -s '[:blank:]' '\n' \ < "$BLACKLIST_IPS_TMP_FILE" > "${BLACKLIST_IPS_TMP_FILE}~" && mv "${BLACKLIST_IPS_TMP_FILE}~" "$BLACKLIST_IPS_FILE" exec ./switch-blacklists-on.sh ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/update-exceptions.sh ================================================ #! /bin/sh . ./common.inc if [ ! -s "$EXCEPTIONS_TMP_FILE" ]; then rm -f "$EXCEPTIONS_FILE" "$EXCEPTIONS_TMP_FILE" exit 0 fi tr -s '[:blank:]' '\n' < "$EXCEPTIONS_TMP_FILE" | \ egrep -i '^\s*[0-9a-z_.-]+\s*$' > "${EXCEPTIONS_TMP_FILE}~" && mv "${EXCEPTIONS_TMP_FILE}~" "$EXCEPTIONS_FILE" ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 0946B0C613F47F53008277C6 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0946B0C513F47F53008277C6 /* Cocoa.framework */; }; 0946B0C813F47F53008277C6 /* PreferencePanes.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0946B0C713F47F53008277C6 /* PreferencePanes.framework */; }; 0946B0D213F47F53008277C6 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0946B0D013F47F53008277C6 /* InfoPlist.strings */; }; 0946B0D613F47F53008277C6 /* DNSCrypt.m in Sources */ = {isa = PBXBuildFile; fileRef = 0946B0D513F47F53008277C6 /* DNSCrypt.m */; }; 0946B0D813F47F53008277C6 /* DNSCrypt.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 0946B0D713F47F53008277C6 /* DNSCrypt.tiff */; }; 0946B0DB13F47F53008277C6 /* DNSCrypt.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0946B0D913F47F53008277C6 /* DNSCrypt.xib */; }; 0946B0E413F48065008277C6 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0946B0E313F48065008277C6 /* Security.framework */; }; 09A13ABC145F2D8700B227A4 /* ajax-loader.gif in Resources */ = {isa = PBXBuildFile; fileRef = 09A13ABB145F2D8700B227A4 /* ajax-loader.gif */; }; 09AD01A015D2483500638DCE /* html in Resources */ = {isa = PBXBuildFile; fileRef = 09AD019F15D2483500638DCE /* html */; }; 09B168721906062E003FDBCC /* CHCSVParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 09B168701906062E003FDBCC /* CHCSVParser.h */; }; 09B168731906062E003FDBCC /* CHCSVParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 09B168711906062E003FDBCC /* CHCSVParser.m */; }; 09FB094415C9DE6400B8AAB6 /* usr in Resources */ = {isa = PBXBuildFile; fileRef = 09FB094315C9DE6400B8AAB6 /* usr */; }; 4B36C4651468B87A0085B07C /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B36C4641468B87A0085B07C /* WebKit.framework */; }; 4B89D983147CA39200872F60 /* dnscrypt_256.png in Resources */ = {isa = PBXBuildFile; fileRef = 4B89D982147CA39200872F60 /* dnscrypt_256.png */; }; 4BABEA28144F5A7B006AEF34 /* led_green.png in Resources */ = {isa = PBXBuildFile; fileRef = 4BABEA1F144F5A7B006AEF34 /* led_green.png */; }; 4BABEA29144F5A7B006AEF34 /* led_yellow.png in Resources */ = {isa = PBXBuildFile; fileRef = 4BABEA20144F5A7B006AEF34 /* led_yellow.png */; }; 4BABEA2A144F5A7B006AEF34 /* led_red.png in Resources */ = {isa = PBXBuildFile; fileRef = 4BABEA21144F5A7B006AEF34 /* led_red.png */; }; 4BABEA2B144F5A7B006AEF34 /* shield_yellow.png in Resources */ = {isa = PBXBuildFile; fileRef = 4BABEA22144F5A7B006AEF34 /* shield_yellow.png */; }; 4BABEA2C144F5A7B006AEF34 /* shield_red.png in Resources */ = {isa = PBXBuildFile; fileRef = 4BABEA23144F5A7B006AEF34 /* shield_red.png */; }; 4BABEA2D144F5A7B006AEF34 /* shield_green.png in Resources */ = {isa = PBXBuildFile; fileRef = 4BABEA24144F5A7B006AEF34 /* shield_green.png */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 0946B0C213F47F53008277C6 /* DNSCrypt.prefPane */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DNSCrypt.prefPane; sourceTree = BUILT_PRODUCTS_DIR; }; 0946B0C513F47F53008277C6 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 0946B0C713F47F53008277C6 /* PreferencePanes.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PreferencePanes.framework; path = System/Library/Frameworks/PreferencePanes.framework; sourceTree = SDKROOT; }; 0946B0CA13F47F53008277C6 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 0946B0CB13F47F53008277C6 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 0946B0CC13F47F53008277C6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 0946B0CF13F47F53008277C6 /* DNSCrypt-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "DNSCrypt-Info.plist"; sourceTree = ""; }; 0946B0D113F47F53008277C6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 0946B0D313F47F53008277C6 /* DNSCrypt-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DNSCrypt-Prefix.pch"; sourceTree = ""; }; 0946B0D413F47F53008277C6 /* DNSCrypt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DNSCrypt.h; sourceTree = ""; }; 0946B0D513F47F53008277C6 /* DNSCrypt.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DNSCrypt.m; sourceTree = ""; }; 0946B0D713F47F53008277C6 /* DNSCrypt.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = DNSCrypt.tiff; sourceTree = ""; }; 0946B0DA13F47F53008277C6 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/DNSCrypt.xib; sourceTree = ""; }; 0946B0E113F48056008277C6 /* SecurityFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SecurityFoundation.framework; path = System/Library/Frameworks/SecurityFoundation.framework; sourceTree = SDKROOT; }; 0946B0E313F48065008277C6 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; 09A13ABB145F2D8700B227A4 /* ajax-loader.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = "ajax-loader.gif"; sourceTree = ""; }; 09AD019F15D2483500638DCE /* html */ = {isa = PBXFileReference; lastKnownFileType = folder; name = html; path = extra/html; sourceTree = ""; }; 09B168701906062E003FDBCC /* CHCSVParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CHCSVParser.h; sourceTree = ""; }; 09B168711906062E003FDBCC /* CHCSVParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CHCSVParser.m; sourceTree = ""; }; 09FB094315C9DE6400B8AAB6 /* usr */ = {isa = PBXFileReference; lastKnownFileType = folder; name = usr; path = extra/usr; sourceTree = ""; }; 4B36C4641468B87A0085B07C /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; 4B89D982147CA39200872F60 /* dnscrypt_256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dnscrypt_256.png; sourceTree = ""; }; 4BABEA1F144F5A7B006AEF34 /* led_green.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = led_green.png; sourceTree = ""; }; 4BABEA20144F5A7B006AEF34 /* led_yellow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = led_yellow.png; sourceTree = ""; }; 4BABEA21144F5A7B006AEF34 /* led_red.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = led_red.png; sourceTree = ""; }; 4BABEA22144F5A7B006AEF34 /* shield_yellow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = shield_yellow.png; sourceTree = ""; }; 4BABEA23144F5A7B006AEF34 /* shield_red.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = shield_red.png; sourceTree = ""; }; 4BABEA24144F5A7B006AEF34 /* shield_green.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = shield_green.png; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 0946B0BD13F47F53008277C6 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 4B36C4651468B87A0085B07C /* WebKit.framework in Frameworks */, 0946B0E413F48065008277C6 /* Security.framework in Frameworks */, 0946B0C613F47F53008277C6 /* Cocoa.framework in Frameworks */, 0946B0C813F47F53008277C6 /* PreferencePanes.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 0946B0B513F47F52008277C6 = { isa = PBXGroup; children = ( 0946B0CD13F47F53008277C6 /* DNSCrypt */, 0946B0C413F47F53008277C6 /* Frameworks */, 0946B0C313F47F53008277C6 /* Products */, ); sourceTree = ""; }; 0946B0C313F47F53008277C6 /* Products */ = { isa = PBXGroup; children = ( 0946B0C213F47F53008277C6 /* DNSCrypt.prefPane */, ); name = Products; sourceTree = ""; }; 0946B0C413F47F53008277C6 /* Frameworks */ = { isa = PBXGroup; children = ( 0946B0C513F47F53008277C6 /* Cocoa.framework */, 0946B0C913F47F53008277C6 /* Other Frameworks */, ); name = Frameworks; sourceTree = ""; }; 0946B0C913F47F53008277C6 /* Other Frameworks */ = { isa = PBXGroup; children = ( 0946B0CA13F47F53008277C6 /* AppKit.framework */, 0946B0CB13F47F53008277C6 /* CoreData.framework */, 0946B0CC13F47F53008277C6 /* Foundation.framework */, 0946B0C713F47F53008277C6 /* PreferencePanes.framework */, 0946B0E313F48065008277C6 /* Security.framework */, 0946B0E113F48056008277C6 /* SecurityFoundation.framework */, 4B36C4641468B87A0085B07C /* WebKit.framework */, ); name = "Other Frameworks"; sourceTree = ""; }; 0946B0CD13F47F53008277C6 /* DNSCrypt */ = { isa = PBXGroup; children = ( 0946B0D413F47F53008277C6 /* DNSCrypt.h */, 0946B0D513F47F53008277C6 /* DNSCrypt.m */, 0946B0D913F47F53008277C6 /* DNSCrypt.xib */, 0946B0D713F47F53008277C6 /* DNSCrypt.tiff */, 4B89D982147CA39200872F60 /* dnscrypt_256.png */, 09B1686F1906062E003FDBCC /* CHCSVParser */, 09AD019F15D2483500638DCE /* html */, 09FB094315C9DE6400B8AAB6 /* usr */, 0946B0CE13F47F53008277C6 /* Supporting Files */, ); path = DNSCrypt; sourceTree = ""; }; 0946B0CE13F47F53008277C6 /* Supporting Files */ = { isa = PBXGroup; children = ( 4BABEA1E144F5A67006AEF34 /* Status */, 0946B0CF13F47F53008277C6 /* DNSCrypt-Info.plist */, 0946B0D013F47F53008277C6 /* InfoPlist.strings */, 0946B0D313F47F53008277C6 /* DNSCrypt-Prefix.pch */, ); name = "Supporting Files"; sourceTree = ""; }; 09B1686F1906062E003FDBCC /* CHCSVParser */ = { isa = PBXGroup; children = ( 09B168701906062E003FDBCC /* CHCSVParser.h */, 09B168711906062E003FDBCC /* CHCSVParser.m */, ); path = CHCSVParser; sourceTree = ""; }; 4BABEA1E144F5A67006AEF34 /* Status */ = { isa = PBXGroup; children = ( 09A13ABB145F2D8700B227A4 /* ajax-loader.gif */, 4BABEA1F144F5A7B006AEF34 /* led_green.png */, 4BABEA20144F5A7B006AEF34 /* led_yellow.png */, 4BABEA21144F5A7B006AEF34 /* led_red.png */, 4BABEA22144F5A7B006AEF34 /* shield_yellow.png */, 4BABEA23144F5A7B006AEF34 /* shield_red.png */, 4BABEA24144F5A7B006AEF34 /* shield_green.png */, ); name = Status; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 0946B0BE13F47F53008277C6 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 09B168721906062E003FDBCC /* CHCSVParser.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 0946B0C113F47F53008277C6 /* DNSCrypt */ = { isa = PBXNativeTarget; buildConfigurationList = 0946B0DE13F47F53008277C6 /* Build configuration list for PBXNativeTarget "DNSCrypt" */; buildPhases = ( 0946B0BC13F47F53008277C6 /* Sources */, 0946B0BD13F47F53008277C6 /* Frameworks */, 0946B0BE13F47F53008277C6 /* Headers */, 0946B0BF13F47F53008277C6 /* Resources */, 0946B0C013F47F53008277C6 /* Rez */, ); buildRules = ( ); dependencies = ( ); name = DNSCrypt; productName = DNSCrypt; productReference = 0946B0C213F47F53008277C6 /* DNSCrypt.prefPane */; productType = "com.apple.product-type.bundle"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 0946B0B713F47F52008277C6 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0510; }; buildConfigurationList = 0946B0BA13F47F52008277C6 /* Build configuration list for PBXProject "DNSCrypt" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = 0946B0B513F47F52008277C6; productRefGroup = 0946B0C313F47F53008277C6 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 0946B0C113F47F53008277C6 /* DNSCrypt */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 0946B0BF13F47F53008277C6 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 0946B0D213F47F53008277C6 /* InfoPlist.strings in Resources */, 0946B0D813F47F53008277C6 /* DNSCrypt.tiff in Resources */, 0946B0DB13F47F53008277C6 /* DNSCrypt.xib in Resources */, 4BABEA28144F5A7B006AEF34 /* led_green.png in Resources */, 4BABEA29144F5A7B006AEF34 /* led_yellow.png in Resources */, 4BABEA2A144F5A7B006AEF34 /* led_red.png in Resources */, 4BABEA2B144F5A7B006AEF34 /* shield_yellow.png in Resources */, 4BABEA2C144F5A7B006AEF34 /* shield_red.png in Resources */, 4BABEA2D144F5A7B006AEF34 /* shield_green.png in Resources */, 09A13ABC145F2D8700B227A4 /* ajax-loader.gif in Resources */, 4B89D983147CA39200872F60 /* dnscrypt_256.png in Resources */, 09FB094415C9DE6400B8AAB6 /* usr in Resources */, 09AD01A015D2483500638DCE /* html in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXRezBuildPhase section */ 0946B0C013F47F53008277C6 /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXRezBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 0946B0BC13F47F53008277C6 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 09B168731906062E003FDBCC /* CHCSVParser.m in Sources */, 0946B0D613F47F53008277C6 /* DNSCrypt.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 0946B0D013F47F53008277C6 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 0946B0D113F47F53008277C6 /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; 0946B0D913F47F53008277C6 /* DNSCrypt.xib */ = { isa = PBXVariantGroup; children = ( 0946B0DA13F47F53008277C6 /* en */, ); name = DNSCrypt.xib; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 0946B0DC13F47F53008277C6 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_ENABLE_OBJC_ARC = NO; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_ENABLE_OBJC_GC = supported; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvmgcc42; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.6; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; name = Debug; }; 0946B0DD13F47F53008277C6 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_ENABLE_OBJC_ARC = NO; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_ENABLE_OBJC_GC = supported; GCC_VERSION = com.apple.compilers.llvmgcc42; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.6; SDKROOT = macosx; }; name = Release; }; 0946B0DF13F47F53008277C6 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; COMBINE_HIDPI_IMAGES = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)\"", ); GCC_ENABLE_OBJC_GC = no; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "DNSCrypt/DNSCrypt-Prefix.pch"; GCC_VERSION = ""; INFOPLIST_FILE = "DNSCrypt/DNSCrypt-Info.plist"; INSTALL_PATH = "$(HOME)/Library/PreferencePanes"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = prefPane; }; name = Debug; }; 0946B0E013F47F53008277C6 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; COMBINE_HIDPI_IMAGES = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)\"", ); GCC_ENABLE_OBJC_GC = no; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "DNSCrypt/DNSCrypt-Prefix.pch"; GCC_VERSION = ""; INFOPLIST_FILE = "DNSCrypt/DNSCrypt-Info.plist"; INSTALL_PATH = "$(HOME)/Library/PreferencePanes"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = prefPane; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 0946B0BA13F47F52008277C6 /* Build configuration list for PBXProject "DNSCrypt" */ = { isa = XCConfigurationList; buildConfigurations = ( 0946B0DC13F47F53008277C6 /* Debug */, 0946B0DD13F47F53008277C6 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 0946B0DE13F47F53008277C6 /* Build configuration list for PBXNativeTarget "DNSCrypt" */ = { isa = XCConfigurationList; buildConfigurations = ( 0946B0DF13F47F53008277C6 /* Debug */, 0946B0E013F47F53008277C6 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 0946B0B713F47F52008277C6 /* Project object */; } ================================================ FILE: DNSCrypt-Preference-Pane/DNSCrypt.xcodeproj/project.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: Pages/feedback.haml ================================================ !!! 5 %html{lang: "en"} %head %meta{charset: "utf-8"} %title DNSCrypt feedback form %style{type: "text/css"} :sass body font: family: arial, helvetica, sans-serif margin: 0 h1 margin: 0 form margin: 0 auto width: 500px p margin: 0.25em 0 .error background: #fbb color: #000 fieldset border: none padding: 0 label float: left width: 100px text-align: right padding-right: 1em input width: 200px input[type=submit] width: auto textarea width: 300px height: 170px #submit text-align: center %body %form{action: "feedback.php", method: "post", action: "{{form_url}}"} %h1 Feedback %fieldset %p %label{for: "name"} Name: %input{type: "text", name: "name", autofocus: true, required: true, value: "{{name}}", class: "{{class_name}}"} %p %label{for: "email"} Email: %input{type: "email", name: "email", placeholder: "email@example.com", required: true, value: "{{email}}", class: "{{class_email}}"} %p %label{for: "feedback"} Feedback: %textarea{name: "feedback", class: "{{class_feedback}}"} {{feedback}} %fieldset#submit %input{type: "submit"} ================================================ FILE: Pages/feedback.php ================================================ '); define('FEEDBACK_SUBJECT', 'DNSCrypt Feedback'); function strip_slashes_from_user_data(&$array) { foreach($array as $k => $v) { if (is_array($v)) { strip_slashes_from_user_data($array[$k]); continue; } $array[$k] = stripslashes($v); } } function disable_magic_quotes() { if (get_magic_quotes_gpc()) { strip_slashes_from_user_data($_GET); strip_slashes_from_user_data($_POST); strip_slashes_from_user_data($_COOKIE); } } function render_headers() { header('X-Frame-Options: sameorigin'); header('X-XSS-Protection: 1; mode=block'); header('X-Content-Security-Policy: allow \'self\''); header('Cache-Control: private, max-age=3600'); header('Expires: ' . date('r', time() + 3600)); } function render_tpl($template, $vars) { $tpl = @file_get_contents($template); if (empty($tpl)) { throw new Exception('template'); } foreach ($vars as $key => $value) { foreach (array_keys($vars) as $key_) { if (strstr($value, '{{' . $key . '}}') !== FALSE) { $value = ''; } } $tpl = str_replace('{{' . $key . '}}', htmlspecialchars($value), $tpl); } echo $tpl; } function redirect_to_sent_page($uri) { header('HTTP/1.1 303 See other'); header('Location: ' . $uri); exit; } function _send_email($name, $email, $feedback) { $from = mb_encode_mimeheader($name, 'UTF-8') . '<' . $email . '>'; $to = FEEDBACK_RECIPIENT; $subject = mb_encode_mimeheader(FEEDBACK_SUBJECT, 'UTF-8'); $body = addslashes($feedback); return send_email($from, $to, $subject, $body); } function send_form($name, $email, $feedback) { if (_send_email($name, $email, $feedback) !== TRUE) { redirect_to_sent_page($_SERVER['SCRIPT_NAME']); } redirect_to_sent_page('sent.html'); } function process_feedback(&$errors, &$name, &$email, &$feedback) { $name = trim(isset($_POST['name']) ? (string) $_POST['name'] : ''); $email = trim(isset($_POST['email']) ? (string) $_POST['email'] : ''); $feedback = trim(isset($_POST['feedback']) ? (string) $_POST['feedback'] : ''); if (empty($name)) { array_push($errors, 'name'); } if (! filter_var($email, FILTER_VALIDATE_EMAIL)) { array_push($errors, 'email'); } if (empty($feedback)) { array_push($errors, 'feedback'); } if (! empty($errors)) { return; } session_start(); if (empty($_SESSION['authenticity_token']) || $_GET['authenticity_token'] !== $_SESSION['authenticity_token']) { return; } send_form($name, $email, $feedback); unset($_SESSION['authenticity_token']); } disable_magic_quotes(); render_headers(); $errors = array(); $name = $email = $feedback = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_GET['authenticity_token'])) { process_feedback($errors, $name, $email, $feedback); } if (session_id() === '') { session_start(); } $authenticity_token = md5(uniqid(__FILE__, TRUE)); $_SESSION['authenticity_token'] = $authenticity_token; $form_url = $_SERVER['SCRIPT_NAME'] . '?' . http_build_query(array('authenticity_token' => $authenticity_token)); $vars = array('name' => $name, 'email' => $email, 'feedback' => $feedback, 'form_url' => $form_url); foreach ($errors as $error) { $vars['class_' . $error] = 'error'; } render_tpl('feedback.tpl', $vars + $errors); ================================================ FILE: Pages/feedback.tpl ================================================ DNSCrypt feedback form

Feedback

================================================ FILE: Pages/sent.haml ================================================ !!! 5 %html{lang: "en"} %head %meta{charset: "utf-8"} %meta{"http-equiv" => "refresh", content: "5; url=feedback.php"} %title DNSCrypt feedback sent %style{type: "text/css"} :sass body font: family: arial, helvetica, sans-serif %body %h1 Feedback sent! ================================================ FILE: README.markdown ================================================ OSX client for managing the DNSCrypt Proxy ========================================== The purpose of this application is to allow the user to have a better experience controlling the DNSCrypt Proxy on OSX. [Download dnscrypt-osxclient-1.0.4.dmg](https://github.com/alterstep/dnscrypt-osxclient/releases/download/1.0.4/dnscrypt-osxclient-1.0.4.dmg) for OSX 10.8 (Snow Leopard), OSX 10.9 (Mavericks) and OSX 10.10 (Yosemite). Compatible with: * CloudNS * d0wn * DNSCrypt.eu * okTurtles * OpenDNS * OpenNIC * Soltysiak