aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax <post@wickenrode.com>2015-10-06 01:31:09 +0200
committerMax <post@wickenrode.com>2015-10-06 01:31:09 +0200
commit31de04a0c45639b2b78405aa4ab3e4696268cc73 (patch)
treed172e481ec350cfcd01f898cb6a3ca6109a599fd
parentd4641ec90fe1b50fca0256e26338d955290fd8b7 (diff)
downloadsequelpro-31de04a0c45639b2b78405aa4ab3e4696268cc73.tar.gz
sequelpro-31de04a0c45639b2b78405aa4ab3e4696268cc73.tar.bz2
sequelpro-31de04a0c45639b2b78405aa4ab3e4696268cc73.zip
Fix broken keychain access with SSH on 10.6 (fixes #2268)
(From the department of commits to be rolled back soon)
-rw-r--r--Source/SPKeychain.m39
-rw-r--r--Source/SPOSInfo.m5
-rw-r--r--sequel-pro.xcodeproj/project.pbxproj2
3 files changed, 29 insertions, 17 deletions
diff --git a/Source/SPKeychain.m b/Source/SPKeychain.m
index ac7bd390..48283359 100644
--- a/Source/SPKeychain.m
+++ b/Source/SPKeychain.m
@@ -31,6 +31,7 @@
#import "SPKeychain.h"
#import "SPAlertSheets.h"
+#import "SPOSInfo.h"
#import <Security/Security.h>
#import <CoreFoundation/CoreFoundation.h>
@@ -212,33 +213,38 @@
- (BOOL)passwordExistsForName:(NSString *)name account:(NSString *)account
{
#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
- NSMutableDictionary *query = [NSMutableDictionary dictionary];
-
- [query setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
- [query setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnAttributes];
- [query setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
-
- [query setObject:account forKey:(id)kSecAttrAccount];
- [query setObject:name forKey:(id)kSecAttrService];
-
- CFDictionaryRef result = NULL;
-
- return SecItemCopyMatching((CFDictionaryRef)query, (CFTypeRef *)&result) == errSecSuccess;
-#else
+ // "kSecClassGenericPassword" was introduced with the 10.7 SDK.
+ // It won't work on 10.6 either (meaning this code never matches properly there).
+ // (That's why there are compile time and runtime checks here)
+ if([SPOSInfo isOSVersionAtLeastMajor:10 minor:7 patch:0]) {
+ NSMutableDictionary *query = [NSMutableDictionary dictionary];
+
+ [query setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
+ [query setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnAttributes];
+ [query setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
+
+ [query setObject:account forKey:(id)kSecAttrAccount];
+ [query setObject:name forKey:(id)kSecAttrService];
+
+ CFDictionaryRef result = NULL;
+
+ return SecItemCopyMatching((CFDictionaryRef)query, (CFTypeRef *)&result) == errSecSuccess;
+ }
+#endif
SecKeychainItemRef item;
SecKeychainSearchRef search = NULL;
NSInteger numberOfItemsFound = 0;
SecKeychainAttributeList list;
SecKeychainAttribute attributes[2];
-
+
// Check supplied variables and replaces nils with empty strings
if (!name) name = @"";
if (!account) account = @"";
-
+
attributes[0].tag = kSecAccountItemAttr;
attributes[0].data = (void *)[account UTF8String]; // Account name
attributes[0].length = (UInt32)strlen([account UTF8String]); // Length of account name (bytes)
-
+
attributes[1].tag = kSecServiceItemAttr;
attributes[1].data = (void *)[name UTF8String]; // Service name
attributes[1].length = (UInt32)strlen([name UTF8String]); // Length of service name (bytes)
@@ -257,7 +263,6 @@
if (search) CFRelease(search);
return (numberOfItemsFound > 0);
-#endif
}
/**
diff --git a/Source/SPOSInfo.m b/Source/SPOSInfo.m
index 8d91c067..b862e898 100644
--- a/Source/SPOSInfo.m
+++ b/Source/SPOSInfo.m
@@ -30,6 +30,11 @@
#import "SPOSInfo.h"
+// Needed because this class is also compiled with SequelProTunnelAssistant which can't access SPConstants.h
+#ifndef __MAC_10_10
+#define __MAC_10_10 101000
+#endif
+
#if __MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_10
// This code is available since 10.8 but public only since 10.10
typedef struct {
diff --git a/sequel-pro.xcodeproj/project.pbxproj b/sequel-pro.xcodeproj/project.pbxproj
index bdd39761..02a15375 100644
--- a/sequel-pro.xcodeproj/project.pbxproj
+++ b/sequel-pro.xcodeproj/project.pbxproj
@@ -191,6 +191,7 @@
506CE9311A311C6C0039F736 /* SPTableContentFilterController.m in Sources */ = {isa = PBXBuildFile; fileRef = 506CE9301A311C6C0039F736 /* SPTableContentFilterController.m */; };
507FF1121BBCC57600104523 /* SPFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 507FF1111BBCC57600104523 /* SPFunctions.m */; };
507FF1621BBF0D5000104523 /* SPTableCopyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 112730551180788A000737FD /* SPTableCopyTest.m */; };
+ 507FF2421BC33BBC00104523 /* SPOSInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 50EAB5B71A8FBB08008F627A /* SPOSInfo.m */; };
50A9F8B119EAD4B90053E571 /* SPGotoDatabaseController.m in Sources */ = {isa = PBXBuildFile; fileRef = 50A9F8B019EAD4B90053E571 /* SPGotoDatabaseController.m */; };
50D3C3491A75B8A800B5429C /* GotoDatabaseDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50D3C34B1A75B8A800B5429C /* GotoDatabaseDialog.xib */; };
50D3C3521A77135F00B5429C /* SPParserUtils.c in Sources */ = {isa = PBXBuildFile; fileRef = 50D3C3501A77135F00B5429C /* SPParserUtils.c */; };
@@ -3140,6 +3141,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 507FF2421BC33BBC00104523 /* SPOSInfo.m in Sources */,
586F457B0FDB269E00B428D7 /* RegexKitLite.m in Sources */,
58CDB3410FCE141900F8ACA3 /* SequelProTunnelAssistant.m in Sources */,
58CDB3420FCE142500F8ACA3 /* SPKeychain.m in Sources */,