Compare commits

..
40 Commits
Author SHA1 Message Date
Alter Step fccba1dfb8 only touch! 2017-10-08 18:21:08 +02:00
Alter Step 63594470fd Merge pull request #156 from catap/hide_menubar_icon
Added setting 'hide menubar icon' to panel, and implemented support at menubar app
2017-10-07 21:09:00 +02:00
Kirill A. Korinsky 355b796d5c Added setting 'hide menubar icon' to panel, and implemented support at menubar app 2017-10-07 16:13:35 +04:00
Alter Step 95925d9e2d Merge pull request #140 from mkjaer/Updated-screenshots
Updated screenshots to reflect latest version
2017-02-16 18:32:33 +01:00
Mikael Kjær 1510319bb8 Updated screenshots to reflect latest version 2017-02-16 16:07:47 +04:00
Alter Step e9db17b111 Update ISSUE_TEMPLATE.md 2017-02-16 10:54:50 +01:00
Alter Step 3ec589a1ef issue template! 2017-02-11 22:16:55 +01:00
Alter Step ebeb963aa4 no markdown for issue templates 2017-02-11 22:16:30 +01:00
Alter Step 1b02a3dc77 issue template! 2017-02-11 22:15:42 +01:00
Alter Step 7c7dadd464 macOS >= 10.10 should be compatible 2017-02-11 22:04:50 +01:00
Alter Step 7d66d1be60 publish update 2017-02-11 22:03:53 +01:00
Alter Step d7df143702 new version 1.0.14 2017-02-11 22:00:08 +01:00
Alter Step 8c9a6f09ff verify that ldns doesn't need openssl / remove cksum after network change 2017-02-11 21:45:50 +01:00
Alter Step 780380a1ef Merge pull request #137 from jedisct1/master
Empty the states directory after a reboot
2017-02-11 21:39:31 +01:00
Frank Denis 63065e55c8 Empty the states directory after a reboot
After a shutdown we need to remove the previous checksum file, and maybe removing everything else wouldn't hurt either.

Perhaps the checksum file should also be removed after a network change.
2017-02-11 16:06:49 +01:00
Alter Step 7e6d44e2ab Merge pull request #135 from jedisct1/master
The beginning of a FAQ
2017-02-10 13:29:52 +01:00
Frank Denis 9acd96ceb7 The beginning of a FAQ 2017-02-10 12:13:20 +01:00
Alter Step 8144efe612 publish the new version 2017-02-09 22:02:43 +01:00
Alter Step c69fdc7519 VERSION + 1 2017-02-09 21:54:48 +01:00
Alter Step 1d2778e636 CURRENT_VERSION + 1 2017-02-09 21:52:52 +01:00
Alter Step 1bdc80b76b remove compatibility with OSX < 10.12 2017-02-09 21:04:43 +01:00
Alter Step f971a7fe19 Delete CPU requirements 2017-02-09 13:54:10 +01:00
Alter Step 654ac623bb update 2017-02-09 13:54:06 +01:00
Alter Step 9530c272a3 Find config differences to do less reloads
This is not 100% fail proof , because the configuration can change and
come back to the original one during the server restart but at the end
of the day it's a better user experience.
2017-02-09 10:47:34 +01:00
Alter Step 5495b8b885 less ugly 2017-02-09 02:28:37 +01:00
Alter Step 15dcfdbe02 Reduce the fontsize 2017-02-09 02:21:46 +01:00
Alter Step da5f9b9ce8 wildcards at the end of an ip -> ok! 2017-02-09 02:16:17 +01:00
Alter Step 17c48f58c1 Refresh faster 2017-02-09 02:10:54 +01:00
Alter Step 5a42ae621a Dont erase .tmp files, this is the data from the UI 2017-02-09 02:05:18 +01:00
Alter Step 9b6fbab397 useful script 2017-02-09 02:01:42 +01:00
Alter Step 44908fa7de many many changes! 2017-02-09 02:01:13 +01:00
Alter Step e268f23c3d Merge branch 'master' of https://github.com/alterstep/dnscrypt-osx-client
* 'master' of https://github.com/alterstep/dnscrypt-osx-client:
  Add brew cask installation instructions.
  macOS
2017-02-08 02:38:56 +01:00
Alter Step f6aa7c2f8d Goodbye fallback! 2017-02-08 02:38:46 +01:00
Alter Step 217bdfba9a xib 2017-02-08 00:15:22 +01:00
Alter Step 9f4a56f4e8 Merge pull request #124 from sepehr/patch-1
Add brew cask installation instructions
2016-12-22 00:16:46 +01:00
Sepehr Lajevardi ea3b7e6f8e Add brew cask installation instructions. 2016-12-21 21:14:40 +03:30
Alter Step 658e5ed2e6 macOS 2016-08-02 18:38:23 +02:00
Alter Step f3687a2aa0 Screen captures 2016-08-01 23:59:05 +02:00
Alter Step c90946bb04 Screen captures 2016-08-01 23:58:15 +02:00
Alter Step 4f1b2ec86e Works on Sierra 2016-07-31 15:07:10 +02:00
62 changed files with 815 additions and 785 deletions
+17
View File
@@ -0,0 +1,17 @@
*****************************************************************************************************************
Before creating an issue, please read the FAQ: https://github.com/alterstep/dnscrypt-osxclient/blob/master/FAQ.md
Informations and debug logs as explained here are almost always more useful that screenshots!
Thank you!
*****************************************************************************************************************
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

-16
View File
@@ -1,16 +0,0 @@
/*
* 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.
*/
@@ -34,5 +34,6 @@ typedef enum {
- (IBAction)preferencesMenuItemPushed:(NSMenuItem *)sender;
- (IBAction)dnscryptMenuItemPushed:(NSMenuItem *)sender;
- (IBAction)hideMenubarIconMenuItemPushed:(NSMenuItem *)sender;
@end
@@ -101,6 +101,14 @@ BOOL appUpdated = FALSE;
}
[self updateLedStatus];
NSString *hideMenuBar = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./get-hide-menubar-icon-status.sh | ./get-upstream-resolvers.sh", nil]];
if ([hideMenuBar isEqualToString: @"yes"]) {
_statusItem.visible = FALSE;
} else if ([hideMenuBar isEqualToString: @"no"]) {
_statusItem.visible = TRUE;
}
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;
@@ -213,4 +221,17 @@ BOOL appUpdated = FALSE;
}
}
- (BOOL) setHideMenubarIconOn {
[self showSpinners];
NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-hide-menubar-icon-on.sh", nil]];
(void) res;
_statusItem.visible = FALSE;
return TRUE;
}
- (IBAction)hideMenubarIconMenuItemPushed:(NSMenuItem *)sender
{
[self setHideMenubarIconOn];
}
@end
@@ -17,11 +17,11 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0.12</string>
<string>1.0.14</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0.12</string>
<string>1.0.14</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string>
<key>LSMinimumSystemVersion</key>
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13D45a" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="13196" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
<dependencies>
<deployment defaultVersion="1060" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="13196"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
@@ -11,7 +11,7 @@
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customObject id="494" customClass="AppDelegate">
<connections>
<outlet property="dnscryptMenu" destination="539" id="543"/>
@@ -45,12 +45,18 @@
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="554"/>
<menuItem title="Hide from the menu bar" keyEquivalent="h" id="558">
<menuItem title="Hide from the menu bar" keyEquivalent="h" id="yYW-Ye-NGW">
<connections>
<action selector="hideMenubarIconMenuItemPushed:" target="494" id="QDi-0b-iiy"/>
</connections>
</menuItem>
<menuItem title="Quit" keyEquivalent="q" id="558">
<connections>
<action selector="terminate:" target="-1" id="560"/>
</connections>
</menuItem>
</items>
<point key="canvasLocation" x="139" y="175.5"/>
</menu>
</objects>
</document>
@@ -539,7 +539,7 @@
<key>USE_HFS+_COMPRESSION</key>
<true/>
<key>VERSION</key>
<string>1.0.12</string>
<string>1.0.13.1</string>
</dict>
<key>TYPE</key>
<integer>0</integer>
@@ -1032,7 +1032,7 @@
<key>USE_HFS+_COMPRESSION</key>
<true/>
<key>VERSION</key>
<string>1.0.12</string>
<string>1.0.13</string>
</dict>
<key>TYPE</key>
<integer>0</integer>
@@ -1237,42 +1237,6 @@
<dict>
<key>LIST</key>
<array>
<dict>
<key>BEHAVIOR</key>
<integer>3</integer>
<key>DICTIONARY</key>
<dict>
<key>IC_REQUIREMENT_CPU_ARCHITECTURE_FAMILY</key>
<integer>2</integer>
<key>IC_REQUIREMENT_CPU_INTEL_ARCHITECTURE_TYPE</key>
<integer>0</integer>
<key>IC_REQUIREMENT_CPU_MINIMUM_CPU_CORES_COUNT</key>
<integer>1</integer>
<key>IC_REQUIREMENT_CPU_MINIMUM_FREQUENCY</key>
<integer>866666</integer>
<key>IC_REQUIREMENT_CPU_POWERPC_ARCHITECTURE_TYPE</key>
<integer>0</integer>
</dict>
<key>IC_REQUIREMENT_CHECK_TYPE</key>
<integer>0</integer>
<key>IDENTIFIER</key>
<string>fr.whitebox.Packages.requirement.cpu</string>
<key>MESSAGE</key>
<array>
<dict>
<key>LANGUAGE</key>
<string>English</string>
<key>SECONDARY_VALUE</key>
<string></string>
<key>VALUE</key>
<string>The DNSCrypt GUI for Mac currently requires at least an Intel Core CPU.</string>
</dict>
</array>
<key>NAME</key>
<string>Processor</string>
<key>STATE</key>
<true/>
</dict>
<dict>
<key>BEHAVIOR</key>
<integer>3</integer>
@@ -1281,7 +1245,7 @@
<key>IC_REQUIREMENT_OS_DISK_TYPE</key>
<integer>0</integer>
<key>IC_REQUIREMENT_OS_DISTRIBUTION_TYPE</key>
<integer>1</integer>
<integer>0</integer>
<key>IC_REQUIREMENT_OS_MINIMUM_VERSION</key>
<integer>100800</integer>
</dict>
@@ -1482,6 +1446,11 @@
<string>DNSCrypt</string>
</dict>
</dict>
<key>SHARED_GLOBAL_DATA</key>
<dict>
<key>IC_REQUIREMENT_JAVASCRIPT_SHARED_SOURCE_CODE</key>
<string></string>
</dict>
<key>TYPE</key>
<integer>0</integer>
<key>VERSION</key>
+1 -1
View File
@@ -1,6 +1,6 @@
#! /bin/sh
VERSION='1.0.12'
VERSION='1.0.14'
echo '*** Do not forget to increase CURRENT_VERSION in common.inc'
sleep 10
-21
View File
@@ -1,21 +0,0 @@
/*
* Copyright (c) 2011-2014 OpenDNS, Inc.
* Copyright (c) 2014-2015 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/)
@@ -7,6 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
0932D7F61E4B324A00E8F3FC /* NSPlaceHolderTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0932D7F51E4B324A00E8F3FC /* NSPlaceHolderTextView.m */; };
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 */; };
@@ -29,6 +30,8 @@
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
0932D7F51E4B324A00E8F3FC /* NSPlaceHolderTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSPlaceHolderTextView.m; sourceTree = "<group>"; };
0932D7F71E4B327D00E8F3FC /* NSPlaceHolderTextView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NSPlaceHolderTextView.h; sourceTree = "<group>"; };
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; };
@@ -124,6 +127,7 @@
09AD019F15D2483500638DCE /* html */,
09FB094315C9DE6400B8AAB6 /* usr */,
0946B0CE13F47F53008277C6 /* Supporting Files */,
096AF93A1E4B565A003C3D67 /* UI Additions */,
);
path = DNSCrypt;
sourceTree = "<group>";
@@ -139,6 +143,15 @@
name = "Supporting Files";
sourceTree = "<group>";
};
096AF93A1E4B565A003C3D67 /* UI Additions */ = {
isa = PBXGroup;
children = (
0932D7F51E4B324A00E8F3FC /* NSPlaceHolderTextView.m */,
0932D7F71E4B327D00E8F3FC /* NSPlaceHolderTextView.h */,
);
name = "UI Additions";
sourceTree = "<group>";
};
09B1686F1906062E003FDBCC /* CHCSVParser */ = {
isa = PBXGroup;
children = (
@@ -258,6 +271,7 @@
buildActionMask = 2147483647;
files = (
09B168731906062E003FDBCC /* CHCSVParser.m in Sources */,
0932D7F61E4B324A00E8F3FC /* NSPlaceHolderTextView.m in Sources */,
0946B0D613F47F53008277C6 /* DNSCrypt.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -17,11 +17,11 @@
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0.12</string>
<string>1.0.14</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0.12</string>
<string>1.0.14</string>
<key>NSHumanReadableCopyright</key>
<string>BSD</string>
<key>NSMainNibFile</key>
+25 -20
View File
@@ -2,8 +2,11 @@
#import <PreferencePanes/PreferencePanes.h>
#import <WebKit/WebKit.h>
#import "CHCSVParser/CHCSVParser.h"
#import "NSPlaceHolderTextView.h"
#define kDNSCRYPT_PACKAGE_VERSION @"1.0.12"
#define kDNSCRYPT_PACKAGE_VERSION @"1.0.14"
#define kDNSCRYPT_PROJECT_URL @"https://dnscrypt.org/osxclient"
#define kDNSCRYPT_PREFPANE_APP_PATH @"/Library/PreferencePanes/DNSCrypt.prefPane"
#define kDNSCRYPT_USR_BASE_DIR kDNSCRYPT_PREFPANE_APP_PATH @"/Contents/Resources/usr"
@@ -14,6 +17,8 @@
#define kDNSCRYPT_CONTROL_DIR kDNSCRYPT_VAR_BASE_DIR @"/control"
#define kDNSCRYPT_QUERY_LOG_FILE @"/var/log/dnscrypt-query.log"
#define kDNSCRYPT_BLOCKED_QUERY_LOG_FILE @"/var/log/dnscrypt-blocked-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"
@@ -22,15 +27,14 @@
#define kRESOLVERS_LIST_FILE kDNSCRYPT_SHARE_BASE_DIR @"/dnscrypt-proxy/dnscrypt-resolvers.csv"
#define kREFRESH_DELAY 2.0
#define kCHECKBOXES_AFTER_CHANGE_DELAY 8.0
#define kREFRESH_DELAY 1.0
#define kMAX_TRIES_AFTER_CHANGE (30 / kREFRESH_DELAY)
typedef enum {
kDNS_CONFIGURATION_UNKNOWN, kDNS_CONFIGURATION_VANILLA, kDNS_CONFIGURATION_LOCALHOST
} DNSConfigurationState;
@interface DNSCrypt : NSPreferencePane {
@interface DNSCrypt : NSPreferencePane<NSTextViewDelegate, WebUIDelegate> {
AuthorizationRef auth;
NSTabView *_tabView;
@@ -38,7 +42,7 @@ typedef enum {
NSTabViewItem *_releaseNotesTabViewItem;
NSButton *_dnscryptButton;
NSButton *_fallbackButton;
NSButton *_hideMenubarIcon;
NSButton *_disableIPv6Button;
NSTextField *_currentResolverTextField;
@@ -47,20 +51,22 @@ typedef enum {
WebView *_releaseNotesWebView;
WebView *_aboutWebView;
NSTextFieldCell *_staticResolversTextField;
NSTextField *_blacklistIPsTextField;
NSTextField *_blacklistDomainsTextField;
NSTextField *_exceptionsTextField;
WebView *_helpWebView;
NSPlaceHolderTextView *_blacklistIPsTextView;
NSPlaceHolderTextView *_blacklistDomainsTextView;
NSPlaceHolderTextView *_exceptionsTextView;
NSButton *_viewLogButton;
NSButton *_queryLoggingButton;
NSButton *_viewBlockedLogButton;
NSButton *_blockedQueryLoggingButton;
NSPopUpButton *_resolverNamesButton;
NSButton *_saveAndApplyChangesButton;
}
@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 NSButton *hideMenubarIcon;
@property (nonatomic, strong) IBOutlet NSButton *disableIPv6Button;
@property (nonatomic, strong) IBOutlet NSTextField *currentResolverTextField;
@@ -69,12 +75,12 @@ typedef enum {
@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 NSPlaceHolderTextView *blacklistIPsTextView;
@property (nonatomic, strong) IBOutlet NSPlaceHolderTextView *blacklistDomainsTextView;
@property (nonatomic, strong) IBOutlet NSPlaceHolderTextView *exceptionsTextView;
@property (nonatomic, strong) IBOutlet NSButton *viewLogButton;
@property (nonatomic, strong) IBOutlet NSButton *queryLoggingButton;
@property (nonatomic, strong) IBOutlet NSButton *blockedQueryLoggingButton;
@property (nonatomic, strong) IBOutlet NSPopUpButton *resolverNamesButton;
@property (nonatomic, strong) IBOutlet NSTextField *locationText;
@@ -86,18 +92,17 @@ typedef enum {
- (void) mainViewDidLoad;
- (IBAction)dnscryptButtonPressed:(NSButton *)sender;
- (IBAction)fallbackButtonPressed:(NSButton *)sender;
- (IBAction)hideMenubarIcon:(NSButton *)sender;
- (IBAction)disableIPv6ButtonPressed:(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)blockedQueryLoggingButtonPressed:(NSButtonCell *)sender;
- (IBAction)viewBlockedLogButtonPushed:(NSButton *)sender;
- (IBAction)resolversNamesPopupButtonPressed:(NSPopUpButton *)sender;
- (IBAction)saveAndApplyChangesButtonPressed:(NSButton *)sender;
- (IBAction)helpButtonPressed:(NSButton *)sender;
@end
+92 -49
View File
@@ -8,15 +8,15 @@
@synthesize releaseNotesWebView = _releaseNotesWebView;
@synthesize aboutWebView = _aboutWebView;
@synthesize staticResolversTextField = _staticResolversTextField;
@synthesize blacklistIPsTextField = _blacklistIPsTextField;
@synthesize blacklistDomainsTextField = _blacklistDomainsTextField;
@synthesize helpWebView = _helpWebView;
@synthesize blacklistIPsTextView = _blacklistIPsTextView;
@synthesize blacklistDomainsTextView = _blacklistDomainsTextView;
@synthesize exceptionsTextView = _exceptionsTextView;
@synthesize viewLogButton = _viewLogButton;
@synthesize queryLoggingButton = _queryLoggingButton;
@synthesize exceptionsTextField = _exceptionsTextField;
@synthesize blockedQueryLoggingButton = _blockedQueryLoggingButton;
@synthesize dnscryptButton = _dnscryptButton;
@synthesize fallbackButton = _fallbackButton;
@synthesize disableIPv6Button = _disableIPv6Button;
@synthesize hideMenubarIcon = _hideMenubarIcon;
@synthesize statusImageView = _statusImageView;
@synthesize statusText = _statusText;
@synthesize currentResolverTextField = _currentResolverTextField;
@@ -24,11 +24,15 @@
DNSConfigurationState currentState = kDNS_CONFIGURATION_UNKNOWN;
NSArray *resolversList;
BOOL blacklistDomainsUpdated = FALSE;
BOOL blacklistIPsUpdated = FALSE;
BOOL exceptionsUpdated = FALSE;
- (void) setCheckBoxesEnabled: (BOOL) enabled
{
[_dnscryptButton setEnabled: enabled];
[_fallbackButton setEnabled: enabled];
[_hideMenubarIcon setEnabled: enabled];
[_disableIPv6Button setEnabled: enabled];
[_resolverNamesButton setEnabled: enabled];
}
@@ -57,16 +61,20 @@ NSArray *resolversList;
NSString *res;
_dnscryptButton.state = 0;
_fallbackButton.state = 0;
_hideMenubarIcon.state = 0;
_disableIPv6Button.state = 0;
[_blacklistIPsTextView setPlaceHolderText: @"IP addresses to block.\n\nExamples:\n\n203.0.113.7\n198.51.100.*"];
[_blacklistDomainsTextView setPlaceHolderText: @"Domains and patterns to block.\n\nExamples:\n\nexample.com\nads.*\n*sex*"];
[_exceptionsTextView setPlaceHolderText: @"Domains bypassing DNSCrypt.\n\nExamples:\n\nlocal\nlocaldomain\nlan"];
res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-f", @"-c", @"cd '" kDNSCRYPT_SCRIPTS_BASE_DIR @"' && exec ./get-dnscrypt-status.sh", nil]];
if ([res isEqualToString: @"yes"]) {
[_dnscryptButton setState: 1];
}
res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-f", @"-c", @"cd '" kDNSCRYPT_SCRIPTS_BASE_DIR @"' && exec ./get-fallback-status.sh", nil]];
res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-f", @"-c", @"cd '" kDNSCRYPT_SCRIPTS_BASE_DIR @"' && exec ./get-hide-menubar-icon-status.sh", nil]];
if ([res isEqualToString: @"yes"]) {
[_fallbackButton setState: 1];
[_hideMenubarIcon setState: 1];
}
res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-f", @"-c", @"cd '" kDNSCRYPT_SCRIPTS_BASE_DIR @"' && exec ./get-aaaa-blocking-status.sh", nil]];
if ([res isEqualToString: @"yes"]) {
@@ -78,18 +86,22 @@ NSArray *resolversList;
if ([res isEqualToString: @"yes"]) {
[_queryLoggingButton setState: 1];
}
res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-f", @"-c", @"cd '" kDNSCRYPT_SCRIPTS_BASE_DIR @"' && exec ./get-blocked-query-logging-status.sh", nil]];
if ([res isEqualToString: @"yes"]) {
[_blockedQueryLoggingButton setState: 1];
}
NSString *fileContent;
fileContent = [NSString stringWithContentsOfFile: kDNSCRYPT_BLACKLIST_IPS_TMP_FILE encoding:NSUTF8StringEncoding error: nil];
if (fileContent != nil) {
[_blacklistIPsTextField setStringValue: fileContent];
[_blacklistIPsTextView setString: fileContent];
}
fileContent = [NSString stringWithContentsOfFile: kDNSCRYPT_BLACKLIST_DOMAINS_TMP_FILE encoding:NSUTF8StringEncoding error: nil];
if (fileContent != nil) {
[_blacklistDomainsTextField setStringValue: fileContent];
[_blacklistDomainsTextView setString: fileContent];
}
fileContent = [NSString stringWithContentsOfFile: kDNSCRYPT_EXCEPTIONS_TMP_FILE encoding:NSUTF8StringEncoding error: nil];
if (fileContent != nil) {
[_exceptionsTextField setStringValue: fileContent];
[_exceptionsTextView setString: fileContent];
}
[_resolverNamesButton removeAllItems];
@@ -196,16 +208,16 @@ NSArray *resolversList;
return TRUE;
}
- (BOOL) setFallbackOn {
- (BOOL) setHideMenubarIconOn {
[self showSpinners];
NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-f", @"-c", @"cd '" kDNSCRYPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-fallback-on.sh", nil]];
NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-f", @"-c", @"cd '" kDNSCRYPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-hide-menubar-icon-on.sh", nil]];
(void) res;
return TRUE;
}
- (BOOL) setFallbackOff {
- (BOOL) setHideMenubarIconOff {
[self showSpinners];
NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-f", @"-c", @"cd '" kDNSCRYPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-fallback-off.sh", nil]];
NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-f", @"-c", @"cd '" kDNSCRYPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-hide-menubar-icon-off.sh", nil]];
(void) res;
return TRUE;
}
@@ -233,12 +245,12 @@ NSArray *resolversList;
}
}
- (IBAction)fallbackButtonPressed:(NSButton *)sender
- (IBAction)hideMenubarIcon:(NSButton *)sender
{
if (sender.state != 0) {
[self setFallbackOn];
[self setHideMenubarIconOn];
} else {
[self setFallbackOff];
[self setHideMenubarIconOff];
}
}
@@ -324,17 +336,6 @@ NSArray *resolversList;
} 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
@@ -376,6 +377,20 @@ NSArray *resolversList;
return TRUE;
}
- (BOOL) setBlockedQueryLoggingOn {
[self showSpinners];
NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-f", @"-c", @"cd '" kDNSCRYPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-blocked-query-logging-on.sh", nil]];
(void) res;
return TRUE;
}
- (BOOL) setBlockedQueryLoggingOff {
[self showSpinners];
NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-f", @"-c", @"cd '" kDNSCRYPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-blocked-query-logging-off.sh", nil]];
(void) res;
return TRUE;
}
- (IBAction)queryLoggingButtonPressed:(NSButtonCell *)sender {
if (sender.state != 0) {
[self setQueryLoggingOn];
@@ -384,10 +399,23 @@ NSArray *resolversList;
}
}
- (IBAction)blockedQueryLoggingButtonPressed:(NSButtonCell *)sender {
if (sender.state != 0) {
[self setBlockedQueryLoggingOn];
} else {
[self setBlockedQueryLoggingOff];
}
}
- (IBAction)viewLogButtonPushed:(NSButton *)sender {
[self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-f", @"-c", @"open /Applications/Utilities/Console.app " kDNSCRYPT_QUERY_LOG_FILE " || open " kDNSCRYPT_QUERY_LOG_FILE, nil]];
}
- (IBAction)viewBlockedLogButtonPushed:(NSButton *)sender {
[self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-f", @"-c", @"open /Applications/Utilities/Console.app " kDNSCRYPT_BLOCKED_QUERY_LOG_FILE " || open " kDNSCRYPT_BLOCKED_QUERY_LOG_FILE, nil]];
}
- (BOOL) updateBlacklistIPs {
[self showSpinners];
NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-f", @"-c", @"cd '" kDNSCRYPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./update-blacklist-ips.sh", nil]];
@@ -395,8 +423,8 @@ NSArray *resolversList;
return TRUE;
}
- (IBAction)blacklistIPsUpdated:(NSTextField *)sender {
NSString *content = sender.stringValue;
- (IBAction)blacklistIPsUpdate:(NSPlaceHolderTextView *)sender {
NSString *content = sender.string;
if ([content writeToFile: kDNSCRYPT_BLACKLIST_IPS_TMP_FILE atomically: YES encoding: NSUTF8StringEncoding error: nil] != YES) {
return;
}
@@ -410,8 +438,8 @@ NSArray *resolversList;
return TRUE;
}
- (IBAction)blacklistDomainsUpdated:(NSTextField *)sender {
NSString *content = sender.stringValue;
- (IBAction)blacklistDomainsUpdate:(NSPlaceHolderTextView *)sender {
NSString *content = sender.string;
if ([content writeToFile: kDNSCRYPT_BLACKLIST_DOMAINS_TMP_FILE atomically: YES encoding: NSUTF8StringEncoding error: nil] != YES) {
return;
}
@@ -425,28 +453,43 @@ NSArray *resolversList;
return TRUE;
}
- (IBAction)exceptionsUpdated:(NSTextField *)sender {
NSString *content = sender.stringValue;
- (IBAction)exceptionsUpdate:(NSPlaceHolderTextView *)sender {
NSString *content = sender.string;
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];
- (IBAction)saveAndApplyChangesButtonPressed:(NSButton *)sender {
[self showSpinners];
if (blacklistDomainsUpdated) {
[self blacklistDomainsUpdate: _blacklistDomainsTextView];
}
if (blacklistIPsUpdated) {
[self blacklistIPsUpdate: _blacklistIPsTextView];
}
if (exceptionsUpdated) {
[self exceptionsUpdate: _exceptionsTextView];
}
blacklistDomainsUpdated = FALSE;
blacklistIPsUpdated = FALSE;
exceptionsUpdated = FALSE;
}
-(void)textDidChange:(NSNotification *)notification {
if (notification.object == _blacklistDomainsTextView) {
blacklistDomainsUpdated = TRUE;
} else if (notification.object == _blacklistIPsTextView) {
blacklistIPsUpdated = TRUE;
} else if (notification.object == _exceptionsTextView) {
exceptionsUpdated = TRUE;
}
}
-(void)helpButtonPressed:(NSButton *)sender {
(void) sender;
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString: kDNSCRYPT_PROJECT_URL]];
}
@end
@@ -0,0 +1,15 @@
#ifndef NSPlaceHolderTextView_h
#define NSPlaceHolderTextView_h
#import <Foundation/Foundation.h>
IB_DESIGNABLE
@interface NSPlaceHolderTextView : NSTextView
@property (nonatomic, retain) IBInspectable NSAttributedString *placeHolder;
- (void)setPlaceHolderText:(NSString *)txt;
@end
#endif /* NSPlaceHolderTextView_h */
@@ -0,0 +1,33 @@
#import "NSPlaceHolderTextView.h"
@implementation NSPlaceHolderTextView
@synthesize placeHolder = _placeHolder;
- (void)setPlaceHolderText:(NSString *)txt {
NSColor *txtColor = [NSColor grayColor];
NSDictionary *txtDict = [NSDictionary dictionaryWithObjectsAndKeys:txtColor, NSForegroundColorAttributeName, nil];
_placeHolder = [[NSAttributedString alloc] initWithString:txt attributes:txtDict];
}
- (BOOL)becomeFirstResponder
{
[self setNeedsDisplay:YES];
return [super becomeFirstResponder];
}
- (void)drawRect:(NSRect)rect
{
[super drawRect:rect];
if ([[self string] isEqualToString:@""] && self != [[self window] firstResponder])
[_placeHolder drawAtPoint:NSMakePoint(0,0)];
}
- (BOOL)resignFirstResponder
{
[self setNeedsDisplay:YES];
return [super resignFirstResponder];
}
@end
@@ -1,9 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="8191" systemVersion="15B17c" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="13196" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
<dependencies>
<deployment version="1070" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="8191"/>
<plugIn identifier="com.apple.WebKitIBPlugin" version="8191"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="13196"/>
<plugIn identifier="com.apple.WebKitIBPlugin" version="13196"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="DNSCrypt">
@@ -11,15 +12,15 @@
<outlet property="_window" destination="12" id="26"/>
<outlet property="aboutTabViewItem" destination="356" id="376"/>
<outlet property="aboutWebView" destination="358" id="359"/>
<outlet property="blacklistDomainsTextField" destination="404" id="446"/>
<outlet property="blacklistIPsTextField" destination="402" id="444"/>
<outlet property="currentResolverTextField" destination="174" id="296"/>
<outlet property="blacklistDomainsTextView" destination="gRF-Cw-rp9" id="4B2-cK-eTz"/>
<outlet property="blacklistIPsTextView" destination="Jos-8C-r8h" id="RN8-Gu-oPA"/>
<outlet property="blockedQueryLoggingButton" destination="J2W-Uj-YcC" id="6K0-xb-DKk"/>
<outlet property="currentResolverTextField" destination="Laq-Rf-7ph" id="IoP-Tf-apC"/>
<outlet property="descriptionText" destination="2aF-7O-SkX" id="nM9-H2-22g"/>
<outlet property="disableIPv6Button" destination="ESJ-Kf-yNj" id="xFL-L3-vLp"/>
<outlet property="dnscryptButton" destination="179" id="363"/>
<outlet property="exceptionsTextField" destination="406" id="452"/>
<outlet property="fallbackButton" destination="281" id="365"/>
<outlet property="helpWebView" destination="449" id="450"/>
<outlet property="exceptionsTextView" destination="YvE-Lo-YVl" id="9u8-Sn-Poo"/>
<outlet property="hideMenubarIcon" destination="Y6w-zv-NQr" id="t6p-SL-hiB"/>
<outlet property="locationText" destination="e9H-pq-zb6" id="Elc-qh-Z8b"/>
<outlet property="providerLink" destination="323" id="Riq-Cc-CLa"/>
<outlet property="queryLoggingButton" destination="398" id="458"/>
@@ -48,7 +49,6 @@
<tabView initialItem="100" id="99">
<rect key="frame" x="13" y="10" width="563" height="359"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<animations/>
<font key="font" metaFont="system"/>
<tabViewItems>
<tabViewItem label="General" identifier="1" id="100">
@@ -56,10 +56,9 @@
<rect key="frame" x="10" y="33" width="543" height="313"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button toolTip="Use OpenDNS resolvers with the DNSCrypt protocol" id="179">
<button toolTip="Use the DNSCrypt protocol" id="179">
<rect key="frame" x="15" y="234" width="204" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<buttonCell key="cell" type="check" title="Enable DNSCrypt" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="180">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="systemBold" size="14"/>
@@ -69,54 +68,18 @@
<action selector="dnscryptButtonPressed:" target="-2" id="368"/>
</connections>
</button>
<button id="281">
<rect key="frame" x="15" y="164" width="239" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<string key="toolTip">Only check this box if you often have to connect to public WiFi hotspots and you don't want to manually disable DNSCrypt in order to pass a captive portal.</string>
<animations/>
<buttonCell key="cell" type="check" title="Automatically disable if blocked" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="282">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system" size="14"/>
</buttonCell>
<accessibility description="Fallback to insecure DNS"/>
<connections>
<action selector="fallbackButtonPressed:" target="-2" id="372"/>
</connections>
</button>
<textField verticalHuggingPriority="750" id="162">
<rect key="frame" x="14" y="96" width="173" height="19"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Current DNS settings:" id="163">
<font key="font" metaFont="system" size="16"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" id="Wkj-kT-maK">
<rect key="frame" x="278" y="208" width="70" height="19"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Location:" id="GO7-P1-scE">
<font key="font" metaFont="titleBar"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" id="174">
<rect key="frame" x="14" y="-3" width="240" height="83"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="..." placeholderString="" id="175">
<font key="font" size="14" name="Monaco"/>
<color key="textColor" white="0.2046370968" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" id="rnd-WE-K61">
<rect key="frame" x="278" y="46" width="261" height="122"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" placeholderString="" id="2aF-7O-SkX">
<font key="font" size="14" name="Monaco"/>
<color key="textColor" white="0.2046370968" alpha="1" colorSpace="calibratedWhite"/>
@@ -126,7 +89,6 @@
<textField verticalHuggingPriority="750" id="274">
<rect key="frame" x="55" y="283" width="219" height="19"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="..." placeholderString="" id="275">
<font key="font" size="16" name="Monaco"/>
<color key="textColor" white="0.2046370968" alpha="1" colorSpace="calibratedWhite"/>
@@ -136,22 +98,16 @@
<imageView id="270">
<rect key="frame" x="17" y="277" width="32" height="32"/>
<autoresizingMask key="autoresizingMask"/>
<animations/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" animates="YES" imageAlignment="topLeft" imageScaling="proportionallyDown" image="ajax-loader" id="271"/>
</imageView>
<box horizontalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" id="276">
<box horizontalHuggingPriority="750" boxType="separator" id="276">
<rect key="frame" x="270" y="2" width="4" height="300"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
<color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<font key="titleFont" metaFont="system"/>
</box>
<button verticalHuggingPriority="750" id="323">
<rect key="frame" x="274" y="10" width="269" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<buttonCell key="cell" type="push" title="http://www.dnscrypt.org" alternateTitle="Browse the OpenDNS web site" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="324">
<buttonCell key="cell" type="push" title="http://www.dnscrypt.org" alternateTitle="Browse the provider website" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="324">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
@@ -159,18 +115,13 @@
<action selector="providerLinkPushed:" target="-2" id="HYc-qW-k00"/>
</connections>
</button>
<box verticalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" id="345">
<box verticalHuggingPriority="750" boxType="separator" id="345">
<rect key="frame" x="17" y="193" width="240" height="5"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
<color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<font key="titleFont" metaFont="system"/>
</box>
<textField verticalHuggingPriority="750" id="UQr-Gd-nzd">
<rect key="frame" x="324" y="268" width="183" height="19"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="DNSCrypt name server:" id="ctO-Mw-4JZ">
<font key="font" metaFont="system" size="16"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -180,7 +131,6 @@
<popUpButton toolTip="Select the resolver to use" verticalHuggingPriority="750" id="yY6-5S-StG">
<rect key="frame" x="286" y="232" width="260" height="26"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<popUpButtonCell key="cell" type="push" title="None selected" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="zMy-SG-d4L" id="LPZ-wM-tAR">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@@ -197,10 +147,18 @@
<action selector="resolversNamesPopupButtonPressed:" target="-2" id="fEP-TP-PCO"/>
</connections>
</popUpButton>
<button toolTip="Do not try to resolve IPv6 records" id="ESJ-Kf-yNj">
<rect key="frame" x="15" y="133" width="252" height="18"/>
<textField verticalHuggingPriority="750" id="e9H-pq-zb6">
<rect key="frame" x="278" y="182" width="267" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" alignment="left" placeholderString="-" id="q83-P7-DNW">
<font key="font" size="12" name="Monaco"/>
<color key="textColor" white="0.2046370968" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button toolTip="Do not try to resolve IPv6 records" misplaced="YES" id="ESJ-Kf-yNj">
<rect key="frame" x="15" y="155" width="252" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<buttonCell key="cell" type="check" title="Disable IPv6 to reduce IPv4 latency" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="cCj-X4-U6n">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system" size="14"/>
@@ -210,18 +168,38 @@
<action selector="disableIPv6ButtonPressed:" target="-2" id="s7R-gl-0Fy"/>
</connections>
</button>
<textField verticalHuggingPriority="750" id="e9H-pq-zb6">
<rect key="frame" x="278" y="182" width="267" height="27"/>
<textField verticalHuggingPriority="750" misplaced="YES" id="162">
<rect key="frame" x="15" y="93" width="173" height="19"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" alignment="left" placeholderString="-" id="q83-P7-DNW">
<font key="font" size="12" name="Monaco"/>
<color key="textColor" white="0.2046370968" alpha="1" colorSpace="calibratedWhite"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Current DNS settings:" id="163">
<font key="font" metaFont="system" size="16"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField identifier="currentResolver" verticalHuggingPriority="750" misplaced="YES" id="Laq-Rf-7ph">
<rect key="frame" x="7" y="17" width="261" height="68"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" placeholderString="" id="EEK-vb-MH8">
<font key="font" size="14" name="Monaco"/>
<color key="textColor" white="0.2046370968" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<accessibility description="Current resolver IP addresses"/>
</textField>
<button toolTip="Use the DNSCrypt protocol" misplaced="YES" id="Y6w-zv-NQr">
<rect key="frame" x="15" y="205" width="204" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Hide menubar icon" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="yaC-i9-RQL">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system" size="14"/>
</buttonCell>
<accessibility description="Enable DNSCrypt"/>
<connections>
<action selector="hideMenubarIcon:" target="-2" id="7kK-mO-czX"/>
</connections>
</button>
</subviews>
<animations/>
</view>
</tabViewItem>
<tabViewItem label="Advanced" identifier="2" id="388">
@@ -229,20 +207,18 @@
<rect key="frame" x="10" y="33" width="543" height="313"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" id="390">
<rect key="frame" x="5" y="236" width="406" height="17"/>
<textField verticalHuggingPriority="750" misplaced="YES" id="390">
<rect key="frame" x="5" y="256" width="406" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="When not using DNSCrypt, use the following static DNS servers:" id="391">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" id="392">
<rect key="frame" x="8" y="206" width="526" height="22"/>
<textField verticalHuggingPriority="750" misplaced="YES" id="392">
<rect key="frame" x="8" y="226" width="526" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" toolTip="Leave empty to use DHCP-provided servers" placeholderString="Space-separated list of IP addresses or leave blank for DHCP" drawsBackground="YES" usesSingleLineMode="YES" id="393">
<font key="font" size="13" name="Courier"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@@ -256,10 +232,9 @@
<action selector="staticResolversTextFieldChanged:" target="-2" id="432"/>
</connections>
</textField>
<button id="398">
<rect key="frame" x="7" y="281" width="126" height="18"/>
<button misplaced="YES" id="398">
<rect key="frame" x="7" y="290" width="126" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<buttonCell key="cell" type="check" title="Log DNS queries" bezelStyle="regularSquare" imagePosition="left" inset="2" id="399">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
@@ -269,11 +244,10 @@
</buttonCell>
<accessibility description="Log DNS queries"/>
</button>
<button verticalHuggingPriority="750" id="400">
<rect key="frame" x="161" y="273" width="94" height="32"/>
<button verticalHuggingPriority="750" misplaced="YES" id="400">
<rect key="frame" x="127" y="282" width="94" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<buttonCell key="cell" type="push" title="View log" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="401">
<buttonCell key="cell" type="push" title="View query log" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="401">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
@@ -282,94 +256,36 @@
<action selector="viewLogButtonPushed:" target="-2" id="441"/>
</connections>
</button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" id="402">
<rect key="frame" x="10" y="7" width="169" height="141"/>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" misplaced="YES" setsMaxLayoutWidthAtFirstLayout="YES" id="408">
<rect key="frame" x="7" y="180" width="175" height="34"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<textFieldCell key="cell" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="403">
<font key="font" size="11" name="Courier"/>
<string key="placeholderString">IP addresses (IPv4/IPv6) to block.

208.67.0.255
192.0.43.10
::1</string>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<allowedInputSourceLocales>
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
</allowedInputSourceLocales>
</textFieldCell>
<connections>
<action selector="blacklistIPsUpdated:" target="-2" id="445"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" id="404">
<rect key="frame" x="188" y="7" width="169" height="141"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<textFieldCell key="cell" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="405">
<font key="font" size="11" name="Courier"/>
<string key="placeholderString">Domain names to block.

*sex*
ads.*
*.example.com
suspicious.example.net</string>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<allowedInputSourceLocales>
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
</allowedInputSourceLocales>
</textFieldCell>
<connections>
<action selector="blacklistDomainsUpdated:" target="-2" id="447"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" id="406">
<rect key="frame" x="366" y="7" width="169" height="141"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<textFieldCell key="cell" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="Domain names to resolve through the default resolvers instead of DNSCrypt.

localdomain
mycompany.example.net" drawsBackground="YES" id="407">
<font key="font" size="11" name="Courier"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<allowedInputSourceLocales>
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
</allowedInputSourceLocales>
</textFieldCell>
<connections>
<action selector="exceptionsUpdated:" target="-2" id="453"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" id="408">
<rect key="frame" x="7" y="156" width="175" height="34"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Block replies containing any of these IP addresses:" id="409">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" id="410">
<rect key="frame" x="186" y="156" width="175" height="34"/>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" misplaced="YES" setsMaxLayoutWidthAtFirstLayout="YES" id="410">
<rect key="frame" x="186" y="180" width="175" height="34"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Block queries for the following domain names:" id="411">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" id="412">
<rect key="frame" x="363" y="156" width="175" height="34"/>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" misplaced="YES" setsMaxLayoutWidthAtFirstLayout="YES" id="412">
<rect key="frame" x="363" y="180" width="175" height="34"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Bypass DNSCrypt to resolve these domains:" id="413">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button horizontalHuggingPriority="750" verticalHuggingPriority="750" id="416">
<rect key="frame" x="503" y="277" width="25" height="25"/>
<button horizontalHuggingPriority="750" verticalHuggingPriority="750" misplaced="YES" id="416">
<rect key="frame" x="511" y="286" width="25" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<buttonCell key="cell" type="help" bezelStyle="helpButton" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="417">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@@ -378,33 +294,145 @@ ads.*
<action selector="helpButtonPressed:" target="-2" id="451"/>
</connections>
</button>
<textField verticalHuggingPriority="750" id="423">
<rect key="frame" x="467" y="284" width="33" height="17"/>
<box verticalHuggingPriority="750" misplaced="YES" boxType="separator" id="425">
<rect key="frame" x="9" y="279" width="526" height="5"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Help" id="424">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<box verticalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" id="425">
<rect key="frame" x="9" y="265" width="526" height="5"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
<color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<font key="titleFont" metaFont="system"/>
</box>
<webView hidden="YES" maintainsBackForwardList="NO" id="449">
<rect key="frame" x="3" y="-3" width="536" height="278"/>
<autoresizingMask key="autoresizingMask"/>
<animations/>
<webPreferences key="preferences" identifier="helpWebView" defaultFontSize="12" defaultFixedFontSize="12" minimumFontSize="2" plugInsEnabled="NO" javaEnabled="NO" javaScriptEnabled="NO" javaScriptCanOpenWindowsAutomatically="NO" loadsImagesAutomatically="NO" allowsAnimatedImages="NO" allowsAnimatedImageLooping="NO"/>
<accessibility description="Static DNS resolvers"/>
</webView>
<scrollView misplaced="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" id="jMK-cV-G1F">
<rect key="frame" x="7" y="31" width="173" height="141"/>
<autoresizingMask key="autoresizingMask" heightSizable="YES"/>
<clipView key="contentView" id="xbZ-5I-JUV">
<rect key="frame" x="1" y="1" width="171" height="139"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textView importsGraphics="NO" richText="NO" verticallyResizable="YES" usesFontPanel="YES" selectionGranularity="word" findStyle="panel" incrementalSearchingEnabled="YES" allowsUndo="YES" usesRuler="YES" allowsNonContiguousLayout="YES" smartInsertDelete="YES" id="Jos-8C-r8h" customClass="NSPlaceHolderTextView">
<rect key="frame" x="0.0" y="0.0" width="171" height="139"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<size key="minSize" width="171" height="139"/>
<size key="maxSize" width="463" height="10000000"/>
<color key="insertionPointColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<allowedInputSourceLocales>
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
</allowedInputSourceLocales>
<connections>
<outlet property="delegate" destination="-2" id="OZf-fp-jLv"/>
</connections>
</textView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="aEl-Zj-fOn">
<rect key="frame" x="-100" y="-100" width="87" height="18"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="TLo-RQ-0Ze">
<rect key="frame" x="156" y="1" width="16" height="139"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<scrollView misplaced="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" id="Qko-q8-g0Z">
<rect key="frame" x="186" y="31" width="173" height="141"/>
<autoresizingMask key="autoresizingMask" heightSizable="YES"/>
<clipView key="contentView" id="BQE-BC-kgC">
<rect key="frame" x="1" y="1" width="171" height="139"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textView importsGraphics="NO" richText="NO" verticallyResizable="YES" usesFontPanel="YES" findStyle="panel" incrementalSearchingEnabled="YES" allowsUndo="YES" usesRuler="YES" allowsNonContiguousLayout="YES" spellingCorrection="YES" smartInsertDelete="YES" id="gRF-Cw-rp9" customClass="NSPlaceHolderTextView">
<rect key="frame" x="0.0" y="0.0" width="171" height="139"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<size key="minSize" width="171" height="139"/>
<size key="maxSize" width="463" height="10000000"/>
<color key="insertionPointColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<allowedInputSourceLocales>
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
</allowedInputSourceLocales>
<connections>
<outlet property="delegate" destination="-2" id="bRg-GP-ktD"/>
</connections>
</textView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="F7U-rs-cjI">
<rect key="frame" x="-100" y="-100" width="87" height="18"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="I9u-BD-eBC">
<rect key="frame" x="156" y="1" width="16" height="139"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<scrollView misplaced="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" id="sD4-mi-6fB">
<rect key="frame" x="365" y="31" width="173" height="141"/>
<autoresizingMask key="autoresizingMask" heightSizable="YES"/>
<clipView key="contentView" id="UK5-2c-eqe">
<rect key="frame" x="1" y="1" width="171" height="139"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textView importsGraphics="NO" richText="NO" verticallyResizable="YES" usesFontPanel="YES" findStyle="panel" incrementalSearchingEnabled="YES" allowsUndo="YES" usesRuler="YES" allowsNonContiguousLayout="YES" spellingCorrection="YES" smartInsertDelete="YES" id="YvE-Lo-YVl" customClass="NSPlaceHolderTextView">
<rect key="frame" x="0.0" y="0.0" width="171" height="139"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<size key="minSize" width="171" height="139"/>
<size key="maxSize" width="463" height="10000000"/>
<color key="insertionPointColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<allowedInputSourceLocales>
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
</allowedInputSourceLocales>
<connections>
<outlet property="delegate" destination="-2" id="hUC-03-vFm"/>
</connections>
</textView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="Wuj-rd-fFa">
<rect key="frame" x="-100" y="-100" width="87" height="18"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="WdU-Ib-n7D">
<rect key="frame" x="156" y="1" width="16" height="139"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<button verticalHuggingPriority="750" misplaced="YES" id="Ed0-Kd-FAT">
<rect key="frame" x="179" y="-4" width="187" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Save and apply changes" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="JSd-1Q-unh">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="saveAndApplyChangesButtonPressed:" target="-2" id="541-Cq-wgy"/>
</connections>
</button>
<button misplaced="YES" id="J2W-Uj-YcC">
<rect key="frame" x="246" y="290" width="145" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Log blocked queries" bezelStyle="regularSquare" imagePosition="left" inset="2" id="wk0-j2-TT6">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
<connections>
<action selector="blockedQueryLoggingButtonPressed:" target="-2" id="dEx-Cf-vKu"/>
</connections>
</buttonCell>
<accessibility description="Log blocked DNS queries"/>
</button>
<button verticalHuggingPriority="750" misplaced="YES" id="aHY-xb-fdb">
<rect key="frame" x="388" y="282" width="108" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="View blocked" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="ScZ-t3-c3e">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<accessibility description="View the DNS query log"/>
<connections>
<action selector="viewBlockedLogButtonPushed:" target="-2" id="PNq-Sc-lOb"/>
</connections>
</button>
</subviews>
<animations/>
</view>
</tabViewItem>
<tabViewItem label="About" identifier="3" id="356">
@@ -415,7 +443,6 @@ ads.*
<webView maintainsBackForwardList="NO" id="358">
<rect key="frame" x="17" y="31" width="509" height="279"/>
<autoresizingMask key="autoresizingMask"/>
<animations/>
<webPreferences key="preferences" defaultFontSize="12" defaultFixedFontSize="12" plugInsEnabled="NO" javaEnabled="NO" javaScriptCanOpenWindowsAutomatically="NO" loadsImagesAutomatically="NO" allowsAnimatedImages="NO" allowsAnimatedImageLooping="NO">
<nil key="identifier"/>
</webPreferences>
@@ -423,7 +450,6 @@ ads.*
<button verticalHuggingPriority="750" id="385">
<rect key="frame" x="437" y="-5" width="95" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<buttonCell key="cell" type="push" title="Uninstall" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="386">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@@ -433,7 +459,6 @@ ads.*
</connections>
</button>
</subviews>
<animations/>
</view>
</tabViewItem>
<tabViewItem label="Release Notes" identifier="4" id="349">
@@ -444,20 +469,18 @@ ads.*
<webView maintainsBackForwardList="NO" id="354">
<rect key="frame" x="17" y="17" width="509" height="293"/>
<autoresizingMask key="autoresizingMask"/>
<animations/>
<webPreferences key="preferences" defaultFontSize="12" defaultFixedFontSize="12" plugInsEnabled="NO" javaEnabled="NO" javaScriptCanOpenWindowsAutomatically="NO" loadsImagesAutomatically="NO" allowsAnimatedImages="NO" allowsAnimatedImageLooping="NO">
<nil key="identifier"/>
</webPreferences>
</webView>
</subviews>
<animations/>
</view>
</tabViewItem>
</tabViewItems>
</tabView>
</subviews>
<animations/>
</view>
<point key="canvasLocation" x="620.5" y="104.5"/>
</window>
<customObject id="263"/>
</objects>
@@ -7,6 +7,7 @@
body
font:
family: arial, helvetica, sans-serif
size: 14px
margin: 0
h1
margin: 0
@@ -19,22 +20,13 @@
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.
If you have a firewall, open TCP and UDP ports 53 and 443.
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.
WiFi captive portals dont work if they can't intercept DNS queries
and often block DNSCrypt.
So on public WiFi network, disable DNSCrypt, log in, then you can
enable it again.
%li
Using Little Snitch? There are a few rules you need to establish,
which Little Snitch should prompt for when trying to
@@ -43,6 +35,5 @@
%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 to port 80 (http) of www.apple.com for system process (curl)
%li For automatic updates, allow outgoing TCP connections to port 80 (http) of updates.dnscrypt.org and download.dnscrypt.org, as well as to port 443 (https) of github.com and download.dnscrypt.org for system process (curl)
(Thanks to @cavemandaveman and @TraderStf)
@@ -6,6 +6,7 @@
<style>
body {
font-family: arial, helvetica, sans-serif;
font-size: 14px;
margin: 0; }
h1 {
@@ -22,23 +23,14 @@
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.
If you have a firewall, open TCP and UDP ports 53 and 443.
These are the most common ports used for DNSCrypt.
</li>
<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.
WiFi captive portals dont work if they can't intercept DNS queries
and often block DNSCrypt.
So on public WiFi network, disable DNSCrypt, log in, then you can
enable it again.
</li>
<li>
Using Little Snitch? There are a few rules you need to establish,
@@ -48,7 +40,6 @@
<li>Allow any outgoing connection for system processes (dnscrypt-proxy)</li>
<li>Allow any incoming connection for system process (dnscrypt-proxy)</li>
<li>Allow any outgoing connection for system processes (dig)</li>
<li>Allow outgoing TCP connections to port 80 (http) of www.apple.com for system process (curl)</li>
<li>For automatic updates, allow outgoing TCP connections to port 80 (http) of updates.dnscrypt.org and download.dnscrypt.org, as well as to port 443 (https) of github.com and download.dnscrypt.org for system process (curl)</li>
</ol>
(Thanks to @cavemandaveman and @TraderStf)
@@ -4,11 +4,10 @@
%meta{charset: "utf-8"}
%title Help (advanced settings)
:sass
html
background: #e4e4e4
body
font:
family: arial, helvetica, sans-serif
size: 14px
margin: 1em
h1
margin: 0
@@ -35,9 +34,13 @@
%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
Blocked queries can also go to a log file. The file is named
/var/log/dnscrypt-blocked-query.log
%p
The "View log" button opens it with the log viewer application
so that you can watch it in real time.
so that you can watch it in real time. The other button shows
the blocked queries.
%section
%h2 IP addresses blocking
%p
@@ -57,19 +60,16 @@
%p
This is a list of domain names to be blocked.
%p
"example.com" will only match this specific name, not
"www.example.com".
"example.com" will match "example.com" and "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."
But wildcards are also supported. "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.
Patterns to be blocked should be separated with spaces or new
lines. Flushing your DNS cache is not required.
%p
This feature is only enabled when using DNSCrypt.
%section
@@ -81,7 +81,7 @@
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
local domain names served by appliances like set-top boxes, and
internal domains used in corporate networks.
%p
Domains listed here will bypass DNSCrypt in order to be sent
@@ -4,11 +4,9 @@
<meta charset='utf-8'>
<title>Help (advanced settings)</title>
<style>
html {
background: #e4e4e4; }
body {
font-family: arial, helvetica, sans-serif;
font-size: 14px;
margin: 1em; }
h1 {
@@ -44,9 +42,14 @@
Checking the "Log DNS queries" box dumps all DNS queries sent
by your computer to a file named /var/log/dnscrypt-query.log
</p>
<p>
Blocked queries can also go to a log file. The file is named
<!-- var/log/dnscrypt-blocked-query.log -->
</p>
<p>
The "View log" button opens it with the log viewer application
so that you can watch it in real time.
so that you can watch it in real time. The other button shows
the blocked queries.
</p>
</section>
<section>
@@ -74,22 +77,19 @@
This is a list of domain names to be blocked.
</p>
<p>
"example.com" will only match this specific name, not
"www.example.com".
"example.com" will match "example.com" and "www.example.com".
</p>
<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."
But wildcards are also supported. "ads.*" will match any name
beginning with "ads."
</p>
<p>
Wildcards can also perform substring matching. "*xxx*" will
match any name containing the string "xxx".
</p>
<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.
Patterns to be blocked should be separated with spaces or new
lines. Flushing your DNS cache is not required.
</p>
<p>
This feature is only enabled when using DNSCrypt.
@@ -105,7 +105,7 @@
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
local domain names served by appliances like set-top boxes, and
internal domains used in corporate networks.
</p>
<p>
@@ -2,26 +2,50 @@
%html{lang: "en"}
%head
%meta{charset: "utf-8"}
%title Release notes for DNSCrypt-OSXClient by AlterStep
%title Release notes
:sass
body
font:
family: arial, helvetica, sans-serif
size: 14px
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.14
%time Sat, Feb 11 2017
%p
The previous version (1.0.13) required a recent version of
openssl to be present on the system (plugins need ldns, ldns
needed this). The dependency has been removed.
%body
%article
%h2 Version 1.0.13
%time Thu, Feb 09 2017
%p
No more "automatic fallback". We trust users to know when they
must disable DNSCrypt.
%p
DNS caching for improved speed.
%p
New buttons to log and view blocked queries.
%p
New system to bypass DNSCrypt using dnscrypt-proxy forwarding
module.
%p
Many bug fixes because old code was removed.
%p
dnscrypt-proxy 1.9.0 with support for the new ChaCha20 encryption.
%p
libsodium 1.0.11.
%article
%h2 Version 1.0.12 by AlterStep
%h2 Version 1.0.12
%time Sun, Jul 31 2016
%p
Compatibility with OSX 10.12
@@ -33,7 +57,7 @@
Fixed a regression in the automatic updater for the resolvers list
%article
%h2 Version 1.0.11 by AlterStep
%h2 Version 1.0.11
%time Thu, Mar 3 2016
%p
Compatibility with OSX 10.11
@@ -43,7 +67,7 @@
libsodium 1.0.8
%article
%h2 Version 1.0.10 by AlterStep
%h2 Version 1.0.10
%time Tue, 23 Jul 2015
%p
Compatibility with OSX 10.11 beta 4
@@ -51,25 +75,25 @@
dnscrypt-proxy 1.6.0
%article
%h2 Version 1.0.9 by AlterStep
%h2 Version 1.0.9
%time Tue, 12 Jul 2015
%p
Fixed an issue with libsodium not being found by minisign-verify
%article
%h2 Version 1.0.8 by AlterStep
%h2 Version 1.0.8
%time Tue, 12 Jul 2015
%p
New versions are automatically downloaded
%article
%h2 Version 1.0.7 by AlterStep
%h2 Version 1.0.7
%time Tue, 1 Jul 2015
%p
Fixed a bug in the automatic updater for the resolvers list
%article
%h2 Version 1.0.6 by AlterStep
%h2 Version 1.0.6
%time Tue, 10 Jun 2015
%p
Updated DNSCrypt proxy to version 1.5.0
@@ -84,67 +108,9 @@
is randomly chosen after each reboot
%article
%h2 Version 1.0.5 by AlterStep
%h2 Version 1.0.5
%time Tue, 06 Jan 2015
%p
Updated DNSCrypt proxy to version 1.4.3
%p
Updated libsodium to 1.0.1-minimal
%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 (Mountain Lion), 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
@@ -2,29 +2,61 @@
<html lang='en'>
<head>
<meta charset='utf-8'>
<title>Release notes for DNSCrypt-OSXClient by AlterStep</title>
<title>Release notes</title>
<style>
body {
font-family: arial, helvetica, sans-serif;
font-size: 14px;
margin: 0; }
h1, h2 {
margin: 0; }
h1 {
border-bottom: 1px solid grey; }
article {
padding-left: 1em; }
time {
font-style: italic; }
</style>
</head>
<body>
<h1>Release Notes for DNSCrypt-OSXclient by AlterStep</h1>
<article>
<h2>Version 1.0.12 by AlterStep</h2>
<h2>Version 1.0.14</h2>
<time>Sat, Feb 11 2017</time>
<p>
The previous version (1.0.13) required a recent version of
openssl to be present on the system (plugins need ldns, ldns
needed this). The dependency has been removed.
</p>
</article>
</body>
<body>
<article>
<h2>Version 1.0.13</h2>
<time>Thu, Feb 09 2017</time>
<p>
No more "automatic fallback". We trust users to know when they
must disable DNSCrypt.
</p>
<p>
DNS caching for improved speed.
</p>
<p>
New buttons to log and view blocked queries.
</p>
<p>
New system to bypass DNSCrypt using dnscrypt-proxy forwarding
module.
</p>
<p>
Many bug fixes because old code was removed.
</p>
<p>
dnscrypt-proxy 1.9.0 with support for the new ChaCha20 encryption.
</p>
<p>
libsodium 1.0.11.
</p>
</article>
<article>
<h2>Version 1.0.12</h2>
<time>Sun, Jul 31 2016</time>
<p>
Compatibility with OSX 10.12
@@ -40,7 +72,7 @@
</p>
</article>
<article>
<h2>Version 1.0.11 by AlterStep</h2>
<h2>Version 1.0.11</h2>
<time>Thu, Mar 3 2016</time>
<p>
Compatibility with OSX 10.11
@@ -53,7 +85,7 @@
</p>
</article>
<article>
<h2>Version 1.0.10 by AlterStep</h2>
<h2>Version 1.0.10</h2>
<time>Tue, 23 Jul 2015</time>
<p>
Compatibility with OSX 10.11 beta 4
@@ -63,28 +95,28 @@
</p>
</article>
<article>
<h2>Version 1.0.9 by AlterStep</h2>
<h2>Version 1.0.9</h2>
<time>Tue, 12 Jul 2015</time>
<p>
Fixed an issue with libsodium not being found by minisign-verify
</p>
</article>
<article>
<h2>Version 1.0.8 by AlterStep</h2>
<h2>Version 1.0.8</h2>
<time>Tue, 12 Jul 2015</time>
<p>
New versions are automatically downloaded
</p>
</article>
<article>
<h2>Version 1.0.7 by AlterStep</h2>
<h2>Version 1.0.7</h2>
<time>Tue, 1 Jul 2015</time>
<p>
Fixed a bug in the automatic updater for the resolvers list
</p>
</article>
<article>
<h2>Version 1.0.6 by AlterStep</h2>
<h2>Version 1.0.6</h2>
<time>Tue, 10 Jun 2015</time>
<p>
Updated DNSCrypt proxy to version 1.5.0
@@ -104,7 +136,7 @@
</p>
</article>
<article>
<h2>Version 1.0.5 by AlterStep</h2>
<h2>Version 1.0.5</h2>
<time>Tue, 06 Jan 2015</time>
<p>
Updated DNSCrypt proxy to version 1.4.3
@@ -113,77 +145,5 @@
Updated libsodium to 1.0.1-minimal
</p>
</article>
<article>
<h2>Version 1.0.4 by AlterStep</h2>
<time>Thu, 19 Sep 2014</time>
<p>
Updated DNSCrypt proxy to version 1.4.1
</p>
<p>
Updated libsodium to 0.7.0-minimal
</p>
</article>
<article>
<h2>Version 1.0.3 by AlterStep</h2>
<time>Thu, 18 Jun 2014</time>
<p>
Runs on OSX 10.8 (Mountain Lion), 10.9 (Mavericks) and 10.10 (Yosemite)
</p>
<p>
New set of icons, contributed by Aaron VonderHaar
</p>
</article>
<article>
<h2>Version 1.0.2 by AlterStep</h2>
<time>Thu, 05 Jun 2014</time>
<p>
Improved installation scripts
</p>
<p>
LDNS has been downgraded in order to work on systems without
Homebrew.
</p>
</article>
<article>
<h2>Version 1.0.1 by AlterStep</h2>
<time>Mon, 28 Apr 2014</time>
<p>
Include the release version of dnscrypt-proxy 1.4, with a new
OpenNIC resolver.
</p>
<p>
Wait after dnscrypt-proxy has been turned on before sending a
query. This actually makes state changes faster.
</p>
<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</code>
in
<code>/Library/Application Support/DNSCrypt/control</code>
and the debug log file itself is
<code>/var/log/dnscrypt-osxclient-debug.log</code>
</p>
<p>
Thanks a lot for your feedback on the first version!
</p>
</article>
<article>
<h2>Version 1.0.0 by AlterStep</h2>
<time>Thu, 21 Apr 2014</time>
<p>
This is my first release, based on the source code of the beta
version written by OpenDNS.
</p>
<p>
It has only been tested on OSX 10.9.
</p>
<p>
It includes dnscrypt-proxy 1.4.0, libsodium 0.4.5, libldns 1.6.17.
</p>
<p>
Contact me on Github: https://github.com/alterstep/dnscrypt-osx-client
</p>
</article>
</body>
</html>
+7
View File
@@ -0,0 +1,7 @@
#! /bin/sh
for f_in in *.haml; do
echo "$f_in"
f_out=$(echo "$f_in" | sed -e 's/.haml/.html/')
haml < "$f_in" > "$f_out"
done
@@ -1 +1 @@
libldns.1.dylib
libldns.2.dylib
@@ -2,10 +2,12 @@
. ./common.inc
rm -f "$BLOCKED_QUERY_LOG_FILE"
rm -f "$QUERY_LOG_FILE"
rm -f "$DEBUG_LOG_FILE"
find -x "$RESOLVERS_LIST_STATE" -type f -mtime +1 -exec rm -f {} \; 2>/dev/null
find -x "$APP_UPDATES_STATE" -type f -mtime +1 -exec rm -f {} \; 2>/dev/null
find -x "$STATES_DIR" -type f -exec rm -f {} -exec rm -f {} \; 2>/dev/null
./clear-fw.sh
@@ -1,35 +0,0 @@
#! /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 --connect-timeout 5 -s \
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
@@ -1,10 +0,0 @@
#! /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
@@ -1,5 +1,5 @@
CURRENT_VERSION=5
CURRENT_VERSION=8
DNSCRYPT_USR_BASE_DIR='/Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr'
DNSCRYPT_VAR_BASE_DIR='/Library/Application Support/DNSCrypt'
@@ -16,18 +16,22 @@ 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"
HIDE_MENUBAR_ICON_FILE="${CONTROL_DIR}/hide-menubar-icon"
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"
BLOCKED_QUERY_LOGGING_FILE="${CONTROL_DIR}/blocked-query-logging"
DEBUG_ENABLED_FILE="${CONTROL_DIR}/debug.enabled"
PLUGINS_ENABLED_FILE="${CONTROL_DIR}/plugins.enabled"
CACHE_FILE="${CONTROL_DIR}/plugin-cache.enabled"
QUERY_LOGGING_FILE="${CONTROL_DIR}/plugin-query-logging.enabled"
BLOCKING_FILE="${CONTROL_DIR}/plugin-blocking.enabled"
AAAA_BLOCKING_FILE="${CONTROL_DIR}/plugin-aaaa-blocking.enabled"
FORWARDING_FILE="${CONTROL_DIR}/plugin-forwarding.enabled"
BLOCKED_QUERY_LOG_FILE="${DNSCRYPT_LOG_BASE_DIR}/dnscrypt-blocked-query.log"
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"
@@ -49,23 +53,13 @@ RESOLVERS_LIST_BASE_DIR="${DNSCRYPT_USR_BASE_DIR}/share/dnscrypt-proxy"
RESOLVERS_LIST_PUBLIC_KEY="RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3"
RESOLVERS_LIST_STATE="${STATES_DIR}/resolvers-updated"
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='
belkin corp domain example home host invalid lan local localdomain test freebox.fr fritz.box nowtv.com routerlogin.net l onion
'
export PATH="${DNSCRYPT_USR_BASE_DIR}/sbin:${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() {
@@ -1,63 +0,0 @@
#! /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
@@ -1,13 +0,0 @@
#! /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
@@ -0,0 +1,9 @@
#! /bin/sh
. ./common.inc
if [ -e "$BLOCKED_QUERY_LOGGING_FILE" ]; then
echo 'yes'
else
echo 'no'
fi
@@ -2,9 +2,22 @@
. ./common.inc
ifs=$(ifconfig -a | \
awk '/^[^ :]*:/ { sub(/:.*$/,empty); iface=$0 } /status: active/ { print iface }')
ifs=$(echo $ifs)
get_ifs() {
ifs_save="$IFS"
IFS=''
ifconfig -a | while read line; do
nif=$(echo "$line" | egrep -i '^[^ ]+:\s+flags' | sed 's/:.*$//')
isact=$(echo "$line" | egrep -i 'status:\s*active')
if [ -n "$nif" ]; then
cif="$nif"
elif [ -n "$isact" -a -n "$cif" ]; then
echo $cif
fi
done
IFS="$ifs_save"
}
ifs=$(get_ifs)
typeset -A found
ips=""
@@ -2,7 +2,7 @@
. ./common.inc
if [ -e "$FALLBACK_FILE" ]; then
if [ -e "$HIDE_MENUBAR_ICON_FILE" ]; then
echo 'yes'
else
echo 'no'
@@ -19,7 +19,7 @@ done
if [ "$dnscrypt_proxy_used" = 'yes' \
-a -r "${STATES_DIR}/dnscrypt-proxy-description" ]; then
cat "${STATES_DIR}/dnscrypt-proxy-description" && exit 0
cat "${STATES_DIR}/dnscrypt-proxy-description" && exit 0
fi
echo "$upstream_resolvers"
exit 0
@@ -28,3 +28,5 @@ fi
[ x"$current_uid" != x"$wanted_uid" ] && \
chown -R "${wanted_uid}:0" "$CONTROL_DIR"
exec sleep 1
@@ -4,6 +4,8 @@
PROCESSED_TICKETS_FILE="${STATES_DIR}/processed-tickets"
logger_debug handle_control_change
update() {
lockfile -1 -r 30 "$HANDLERS_LOCK_FILE" || exit 1
@@ -19,15 +21,21 @@ update() {
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
logger_debug "New tickets found"
find "$CONTROL_DIR" -type f -name '[a-zA-Z0-9]*' \! -name '*.tmp' \
-exec md5 {} \; > "${STATES_DIR}/controls.cksum.new"
if cmp -s "${STATES_DIR}/controls.cksum.new" "${STATES_DIR}/controls.cksum"; then
logger_debug "Content of the controls dir actually didn't change"
else
update
mv -f "${STATES_DIR}/controls.cksum.new" "${STATES_DIR}/controls.cksum"
fi
updated='yes'
while read ticket_file; do
rm -f "$ticket_file"
@@ -6,18 +6,19 @@ 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
rm -f "${STATES_DIR}/controls.cksum"
./switch-to-dnscrypt-if-required.sh
rm -f "$HANDLERS_LOCK_FILE"
@@ -15,3 +15,5 @@ if [ "$servers" = "" ]; then
else
echo "$servers" | sed 's/^ *//;s/ *$//' > "$STATIC_RESOLVERS_FILE"
fi
exec ./switch-exceptions-on.sh
@@ -2,6 +2,8 @@
. ./common.inc
CERTIFICATE_MIN_VALIDITY=60
DNSCRYPT_LIB_BASE_DIR="${DNSCRYPT_USR_BASE_DIR}/lib"
export DYLD_LIBRARY_PATH="${DNSCRYPT_LIB_BASE_DIR}:${DYLD_LIBRARY_PATH}"
@@ -34,32 +36,15 @@ try_resolver() {
logger_debug "Running a test dnscrypt proxy for [$description]"
rm -f "${RES_DIR}/${priority}"
exec alarmer 3 dnscrypt-proxy --pid="$pid_file" \
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"
# This doesn't send anything to Apple, and any reliable domain name can be used --
# The following line sends a common query to the chosen DNSCrypt resolver to
# check that it responds and can be used instead of leaving the mac without
# a working DNS configuration.
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
--test="$CERTIFICATE_MIN_VALIDITY" $args
if [ $? = 0 ]; then
logger_debug "Certificate for [$description] received"
echo "$args" > "${RES_DIR}/${priority}"
echo "$description" > "${DESCRIPTIONS_DIR}/${priority}"
fi
rm -f "$pid_file"
}
get_plugin_args() {
@@ -82,11 +67,11 @@ logger_debug "dnscrypt-proxy should be (re)started, stopping previous instance i
wait_pids=""
try_resolver 5004 "${RESOLVER_NAME} using DNSCrypt over UDP" \
try_resolver 1 "${RESOLVER_NAME} using DNSCrypt over UDP" \
"--resolver-name=$RESOLVER_NAME" &
wait_pids="$wait_pids $!"
try_resolver 5005 "${RESOLVER_NAME} using DNSCrypt over TCP" \
try_resolver 2 "${RESOLVER_NAME} using DNSCrypt over TCP" \
"--resolver-name=$RESOLVER_NAME --tcp-only" &
wait_pids="$wait_pids $!"
@@ -105,6 +90,8 @@ if [ x"$best_file" = "x" ]; then
exit 1
fi
./switch-cache-on.sh
plugins_args=''
if [ -r "${DNSCRYPT_PROXY_PLUGINS_BASE_FILE}s.enabled" ]; then
plugin_args=$(get_plugin_args)
@@ -133,23 +120,6 @@ if [ $? != 0 ]; then
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
@@ -3,4 +3,3 @@
. ./common.inc
rm -f "$AAAA_BLOCKING_FILE"
@@ -10,8 +10,11 @@ plugin_args=''
[ -s "$BLACKLIST_DOMAINS_FILE" ] && \
plugin_args="${plugin_args},--domains='${BLACKLIST_DOMAINS_FILE}'"
[ -e "$BLOCKED_QUERY_LOGGING_FILE" ] && \
plugin_args="${plugin_args},--logfile='${BLOCKED_QUERY_LOG_FILE}'"
[ -z "$plugin_args" ] && exec ./switch-blacklists-off.sh
echo "libdcplugin_example_ldns_blocking.la${plugin_args}" > \
"$BLOCKING_FILE"
touch "$PLUGINS_ENABLED_FILE"
touch "$PLUGINS_ENABLED_FILE"
@@ -0,0 +1,9 @@
#! /bin/sh
. ./common.inc
rm -f "$BLOCKED_QUERY_LOGGING_FILE"
exec ./switch-blacklists-on.sh
@@ -0,0 +1,7 @@
#! /bin/sh
. ./common.inc
touch "$BLOCKED_QUERY_LOGGING_FILE"
exec ./switch-blacklists-on.sh
@@ -2,4 +2,5 @@
. ./common.inc
rm -f "$FALLBACK_FILE"
rm -f "$CACHE_FILE"
@@ -0,0 +1,8 @@
#! /bin/sh
. ./common.inc
echo "libdcplugin_example_cache.la" > \
"$CACHE_FILE"
touch "$PLUGINS_ENABLED_FILE"
@@ -2,4 +2,4 @@
. ./common.inc
touch "$FALLBACK_FILE"
rm -f "$FORWARDING_FILE"
@@ -0,0 +1,39 @@
#! /bin/sh
. ./common.inc
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 "$DHCP_DNS_FILE" 2> /dev/null | egrep -i '^[0-9a-f:.]+$'
}
[ -s "$EXCEPTIONS_FILE" ] || exec ./switch-exceptions-off.sh
domains=''
while read domain; do
domains="${domain} ${domains}"
done < "$EXCEPTIONS_FILE"
[ -z "$domains" ] && exec ./switch-exceptions-off.sh
resolvers=$(./get-static-resolvers.sh || get_dhcp_dns || get_gw)
[ -z "$resolvers" ] && exec ./switch-exceptions-off.sh
plugin_args=''
plugin_args="${plugin_args},--domains='${domains}'"
plugin_args="${plugin_args},--resolvers='${resolvers}'"
echo "libdcplugin_example_ldns_forwarding.la${plugin_args}" > \
"$FORWARDING_FILE"
touch "$PLUGINS_ENABLED_FILE"
@@ -0,0 +1,5 @@
#! /bin/sh
. ./common.inc
rm -f "$HIDE_MENUBAR_ICON_FILE"
@@ -0,0 +1,5 @@
#! /bin/sh
. ./common.inc
touch "$HIDE_MENUBAR_ICON_FILE"
@@ -10,53 +10,37 @@ PAUSE_INCREMENT=1
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
rm -f "${STATES_DIR}/controls.cksum"
logger_debug "The proxy should be running but it isn't."
./switch-to-dhcp.sh
fi
fi
[ $pause -lt $PAUSE_MAX ] && pause=$((pause + 1))
pause_counter=0
while [ -e "$DNSCRYPT_FILE" -a $pause_counter -lt $pause ]; do
sleep $PAUSE_UNIT
pause_counter=$((pause_counter + 1))
done
[ $pause -lt $PAUSE_MAX ] && pause=$((pause + 1))
[ ! -e "$DNSCRYPT_FILE" ] && break
if [ -e "$FALLBACK_FILE" ]; then
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
fi
./start-dnscrypt-proxy.sh || continue
./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"
exit 0
fi
exec ./exceptions-add.sh
@@ -8,7 +8,7 @@ if [ ! -s "$BLACKLIST_DOMAINS_TMP_FILE" ]; then
fi
tr -s '[:blank:]' '\n' < "$BLACKLIST_DOMAINS_TMP_FILE" | \
egrep -vi '^(apple[.]com)$' > \
egrep -i '^[*]?[.]?[^.][a-z0-9_.-]+[*]?$' > \
"${BLACKLIST_DOMAINS_TMP_FILE}~" &&
mv "${BLACKLIST_DOMAINS_TMP_FILE}~" "$BLACKLIST_DOMAINS_FILE"
@@ -7,8 +7,9 @@ if [ ! -s "$BLACKLIST_IPS_TMP_FILE" ]; then
exec ./switch-blacklists-on.sh
fi
tr -s '[:blank:]' '\n' \
< "$BLACKLIST_IPS_TMP_FILE" > "${BLACKLIST_IPS_TMP_FILE}~" &&
tr -s '[:blank:]' '\n' < "$BLACKLIST_IPS_TMP_FILE" | \
egrep -i '^[0-9a-fA-F:.]+([.][*])?$' > \
"${BLACKLIST_IPS_TMP_FILE}~" &&
mv "${BLACKLIST_IPS_TMP_FILE}~" "$BLACKLIST_IPS_FILE"
exec ./switch-blacklists-on.sh
@@ -4,9 +4,12 @@
if [ ! -s "$EXCEPTIONS_TMP_FILE" ]; then
rm -f "$EXCEPTIONS_FILE" "$EXCEPTIONS_TMP_FILE"
exit 0
exec ./switch-exceptions-off.sh
fi
tr -s '[:blank:]' '\n' < "$EXCEPTIONS_TMP_FILE" | \
sed -e 's/^ *[*]*[.]*//' -e 's/ *$//' | \
egrep -i '^\s*[0-9a-z_.-]+\s*$' > "${EXCEPTIONS_TMP_FILE}~" &&
mv "${EXCEPTIONS_TMP_FILE}~" "$EXCEPTIONS_FILE"
exec ./switch-exceptions-on.sh
+19 -4
View File
@@ -4,21 +4,36 @@ mkdir -p extra/usr/bin
cp /Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/bin/hostip \
extra/usr/bin/
nd=$(otool -L /Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/sbin/dnscrypt-proxy | wc -l)
if [ $nd -gt 2 ]; then
echo '*** dnscrypt-proxy may have more dependencies than libSystem.B.dylib'
echo '*** make sure that libsodium was statically linked'
sleep 10
fi
nd=$(otool -L /Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/lib/dnscrypt-proxy/libdcplugin_example_ldns_aaaa_blocking.so | wc -l)
if [ $nd -gt 3 ]; then
echo '*** plugins may have more dependencies than libSystem.B.dylib and ldns'
echo '*** make sure that they were linked against ldns compiled without SSL'
sleep 10
fi
mkdir -p extra/usr/sbin
cp /Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/sbin/dnscrypt-proxy \
extra/usr/sbin/
mkdir -p extra/usr/lib
cp /opt/ldns/lib/libldns.1.dylib \
cp /opt/ldns/lib/libldns.2.dylib \
extra/usr/lib/
( cd extra/usr/lib &&
rm -f libldns.dylib &&
ln -fs libldns.1.dylib libldns.dylib )
ln -fs libldns.2.dylib libldns.dylib )
if [ -f /usr/local/lib/libsodium.18.dylib ]; then
echo '*** /usr/local/lib/libsodium.{dylib,la} found'
echo '*** Compile dnscrypt-proxy without them to get a static build'
echo '*** Then reinstall them'
sleep 10
fi
@@ -37,6 +52,6 @@ mkdir -p extra/usr/share/dnscrypt-proxy
cp /Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv \
extra/usr/share/dnscrypt-proxy/
cp /Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/share/dnscrypt-proxy/minisign.pub \
extra/usr/share/dnscrypt-proxy/
Binary file not shown.
+37
View File
@@ -0,0 +1,37 @@
# Possible answsers to Frequently Asked Questions
## "It doesn't work"
Sorry to hear that this application doesn't behave as expected.
Let's go through a few steps that may solve the issues you are experiencing.
1. **Uninstall previous versions.**
In order to do so, open the DNSCrypt OSXClient preferences pane, and click the `Uninstall` button in the `About` tab.
2. **Download the latest official version.**
The package can be installed with `brew cask` or downloaded directly from GitHub: [DNSCrypt OSXClient](https://github.com/alterstep/dnscrypt-osxclient/releases/latest).
Do **not** download this app from unauthorized sources such as MacUpdate or a different GitHub repository. The file you would download from an unauthorized source may be delivered insecurely, may be old, or may contain malware.
3. **Optional:** if you want to double check the authenticity of the file you downloaded, also download the `.minisig` file and use [Minisign](https://jedisct1.github.io/minisign/) to verify the digital signature.
4. **Open the OSXClient preference pane**, select a resolver and try enabling DNSCrypt.
5. Still no joy? **Try a different resolver.** Some of them might experience a temporary outage, or may be blocked by your ISP.
6. **Turn off your VPN.** A VPN already encrypts your data, including DNS data.
7. **Disable antiviruses**, local and remote (router) firewalls, Little Snitch, Little Flocker and other agents preventing applications from working normally.
These can be reenabled later, but we need to make sure that their interaction with OSXClient is not the root cause of the problems you are trying to solve.
8. **Activate logging** by creating a file named `debug.enabled` in the `/Library/Application Support/DNSCrypt/control` directory. The content of that file is not important; only its presence will be checked so an empty file is fine.
When this file is present, OSXClient logs its activity in `/var/log/dnscrypt-osxclient-debug.log`. Reviewing the content of that file while trying to turn DNSCrypt on and off may be very useful in order to understand why things don't work as expected.
9. **Update your operating system** if possible. This user interface, as well as the underlying proxy, have been written for the latest stable major version of MacOS. Apple doesn't make it simple to ensure that an application works on a specific OS version without having a dedicated test device, so the developers can only guess what changes may be required to make these applications also run on older systems.
10. **Report resolver-specific issues to the resolver operator**. OSXClient, Simple DNSCrypt, dnscrypt-proxy, dnsdist, dnscrypt-wrapper are pieces of software, not services. None of the authors work at Yandex or OpenDNS, so we can't help you with your Yandex or OpenDNS account, or with issues specific to a resolver such as a name that cannot be resolved. Please report these issues to the companies and individuals running these services instead. These issues have probably nothing to do with the DNSCrypt protocol itself.
After trying all these steps, open a ticket on the [OSXClient issue tracker](https://github.com/alterstep/dnscrypt-osxclient/issues).
Here are a few hints to maximize the chances for your issue to be addressed as quickly as possible:
1. **Do not post screenshots** unless the bug is specifically about a graphic element of the user interface. Screenshots are not indexed by search engines (not great to helper other users with similar issues), can be hard to read, can be incomplete, don't allow copy/paste, don't play well with command-line tools developers use, and finding what to look for in a screenshot is now always intuitive. Instead, copy/paste relevant information. If that information is short, include it in the description of the issue. If that information is 15 lines or more, save it to a file, and attach the file to the ticket. Or use a GitHub [gist](https://gist.github.com/) or [zerobin](https://zerobin.net/). Short and clear descriptions are always appreciated.
2. **Make sure that you went through the steps above** before filing an issue.
3. **Include some information**: the OSX version you are running, the OSXClient version you installed, and a snippet of the `dnscrypt-osxclient-debug.log` file (not inline, see above). Details such as the model of your computer and the brand of your router are not required.
4. **Summarize your problem**: what you did, what should have happened, and what actually happened. Bugs can be fixed very quickly if the developer can duplicate your problem. But they are very unlikely to be fixed if the developper struggles at understanding why something happens on your machine and not elsewhere. Use a short and meaningful summary as the title of your ticket: this will be immensely useful to other users that look for a solution to the same problem.
5. **Do not write "doesn't work"**: explain exactly what doesn't behave as expected. See the previous point.
6. **Do not hide information**: if you are running an old MacOS version, if didn't try without your antivirus, if you are blocking specific ports and protocols, if you altered the software, if you customized your environment in some way, please mention it.
7. **Share your solution**: did you eventually manage to fix the issue? Fantastic! Before closing the ticket, writing a short description of what you did will be very appreciated by other users!
If the command-line doesn't scare you, you may consider running [dnscrypt-proxy](https://github.com/jedisct1/dnscrypt-proxy/wiki) directly instead of OSXClient.
+10 -1
View File
@@ -4,10 +4,19 @@ 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.dmg](https://github.com/alterstep/dnscrypt-osxclient/releases/latest)
for OSX 10.8 (Mountain Lion), OSX 10.9 (Mavericks), OSX 10.10 (Yosemite) and OSX 10.11 (El Capitan).
for macOS 10.10 (Yosemite), macOS 10.11 (El Capitan) and macOS 10.12 (Sierra).
Compatible with all the DNS servers with DNSCrypt enabled.
Packages are signed with [Minisign](https://jedisct1.github.io/minisign/) and can be verified with:
minisign -V -P RWRvw8aArS/yEI3In0/zQSb9+qfWonLxjjEYG17cXt6zct6GLKtEvUfk -m dnscrypt-osxclient-*.dmg
You can also install this application using Homebrew Cask:
```
brew cask install dnscrypt
```
![Foto 1](1.png)
![Foto 2](2.png)
+5 -5
View File
@@ -1,5 +1,5 @@
10.8 5 https://github.com/alterstep/dnscrypt-osxclient/releases/download/1.0.12/dnscrypt-osxclient-1.0.12.dmg
10.9 5 https://github.com/alterstep/dnscrypt-osxclient/releases/download/1.0.12/dnscrypt-osxclient-1.0.12.dmg
10.10 5 https://github.com/alterstep/dnscrypt-osxclient/releases/download/1.0.12/dnscrypt-osxclient-1.0.12.dmg
10.11 5 https://github.com/alterstep/dnscrypt-osxclient/releases/download/1.0.12/dnscrypt-osxclient-1.0.12.dmg
10.12 5 https://github.com/alterstep/dnscrypt-osxclient/releases/download/1.0.12/dnscrypt-osxclient-1.0.12.dmg
10.8 8 https://github.com/alterstep/dnscrypt-osxclient/releases/download/1.0.14/dnscrypt-osxclient-1.0.14.dmg
10.9 8 https://github.com/alterstep/dnscrypt-osxclient/releases/download/1.0.14/dnscrypt-osxclient-1.0.14.dmg
10.10 8 https://github.com/alterstep/dnscrypt-osxclient/releases/download/1.0.14/dnscrypt-osxclient-1.0.14.dmg
10.11 8 https://github.com/alterstep/dnscrypt-osxclient/releases/download/1.0.14/dnscrypt-osxclient-1.0.14.dmg
10.12 8 https://github.com/alterstep/dnscrypt-osxclient/releases/download/1.0.14/dnscrypt-osxclient-1.0.14.dmg
+3 -3
View File
@@ -1,4 +1,4 @@
untrusted comment: signature from minisign secret key
RWRvw8aArS/yEJ4dpKMNawnmT9zOyXUpQ74mVAjMsxG3VygtaF+6k7YPoire23Tqdk0lcolS16ngIg9dCJPXuNuWUFFwIzqKIQ4=
trusted comment: timestamp:1469970056 file:versions.txt
Sp5RYaUW/tOqKM2Lq2w1Qb1QyH9VTCBG0vwB5VatktYhnXLawYVIQ0eUoDSPhSwiDzxMGNUtPaHoQT0stumjAg==
RWRvw8aArS/yEC0KSUJzl/E1pNue3BhV6XHpINFPjWAQxxgoA5tL8+JOqqhC6vtdgG/9K4Iq8OZeWEWiriwZj0rmshQVpcB9ZQU=
trusted comment: timestamp:1486847028 file:versions.txt
j2By6+I+aOudtAInQZWqMamAqk4AJyjWhTMMNjF0kmelQfuImLZO09vNcuzPrnTM0M+jFiQdzHRLbQA0Fud6AA==