From 92e7b9a652b0d1806d732079574aea7270b8a2c0 Mon Sep 17 00:00:00 2001 From: rowanbeentje Date: Mon, 13 Sep 2010 22:26:54 +0000 Subject: - Implement support for MySQL over SSL for both TCP/IP and Socket connection modes. - Upgrade the MySQL binaries to version 5.1.50 (was 5.1.46) - Enable SSL support in the MySQL libraries (this leads to a large increase in library size, unfortunately) - Enable more optimisations in the MySQL libraries (especially --enable-assembler for faster in-library string processing and --with-mysqld-ldflags=-all-static) This completes support for Issue #27. --- Frameworks/MCPKit/MCPFoundationKit/MCPConnection.h | 7 + Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m | 92 +- Frameworks/MCPKit/MySQL/include/mysql.h | 2 + Frameworks/MCPKit/MySQL/include/mysql_com.h | 10 + Frameworks/MCPKit/MySQL/include/mysql_version.h | 4 +- Frameworks/MCPKit/MySQL/lib/libmysqlclient.a | Bin 1900748 -> 4561036 bytes Frameworks/MCPKit/MySQL/lib/libmysqlclient_r.a | Bin 1935244 -> 4595172 bytes Interfaces/English.lproj/ConnectionView.xib | 3089 ++++++++-- Interfaces/English.lproj/DBView.xib | 85 +- Interfaces/English.lproj/Preferences.xib | 6114 ++++++++++++++------ Resources/English.lproj/ConnectionView.strings | Bin 28478 -> 40006 bytes Resources/English.lproj/DBView.strings | Bin 97514 -> 92384 bytes Resources/English.lproj/Localizable.strings | Bin 171424 -> 177134 bytes Resources/English.lproj/Preferences.strings | Bin 51658 -> 62766 bytes Resources/English.lproj/UserManagerView.strings | Bin 14944 -> 14802 bytes Resources/Images/titlebarlock.png | Bin 0 -> 194 bytes Scripts/build-mysql-client.sh | 4 +- Source/SPConnectionController.h | 28 +- Source/SPConnectionController.m | 224 +- Source/SPDatabaseDocument.m | 35 +- Source/SPPreferenceController.h | 12 +- Source/SPPreferenceController.m | 118 +- sequel-pro.xcodeproj/project.pbxproj | 4 + 23 files changed, 7225 insertions(+), 2603 deletions(-) create mode 100644 Resources/Images/titlebarlock.png diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.h b/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.h index 7e60ccb2..864eb413 100644 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.h +++ b/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.h @@ -139,6 +139,11 @@ NSInteger maxAllowedPacketSize; unsigned long connectionThreadId; + BOOL useSSL; + NSString *sslKeyFilePath; + NSString *sslCertificatePath; + NSString *sslCACertificatePath; + NSString *encoding, *previousEncoding; NSStringEncoding *stringEncoding; BOOL encodingUsesLatin1Transport, previousEncodingUsesLatin1Transport; @@ -207,6 +212,7 @@ // Connection details - (BOOL)setPort:(NSInteger)thePort; - (BOOL)setPassword:(NSString *)thePassword; +- (BOOL) setSSL:(BOOL)shouldUseSSL usingKeyFilePath:(NSString *)keyFilePath certificatePath:(NSString *)certificatePath certificateAuthorityCertificatePath:(NSString *)caCertificatePath; // Proxy - (BOOL)setConnectionProxy:(id )proxy; @@ -217,6 +223,7 @@ - (void)disconnect; - (BOOL)reconnect; - (BOOL)isConnected; +- (BOOL)isConnectedViaSSL; - (BOOL)userTriggeredDisconnect; - (BOOL)checkConnection; - (BOOL)pingConnection; diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m b/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m index d8905d8d..362c3dc6 100644 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m +++ b/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m @@ -48,6 +48,7 @@ BOOL keepAliveActive; const NSUInteger kMCPConnectionDefaultOption = CLIENT_COMPRESS | CLIENT_REMEMBER_OPTIONS | CLIENT_MULTI_RESULTS; const char *kMCPConnectionDefaultSocket = MYSQL_UNIX_ADDR; +const char *kMCPSSLCipherList = "DHE-RSA-AES256-SHA:AES256-SHA:DHE-RSA-AES128-SHA:AES128-SHA:AES256-RMD:AES128-RMD:DES-CBC3-RMD:DHE-RSA-AES256-RMD:DHE-RSA-AES128-RMD:DHE-RSA-DES-CBC3-RMD:RC4-SHA:RC4-MD5:DES-CBC3-SHA:DES-CBC-SHA:EDH-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC-SHA"; const NSUInteger kMCPConnection_Not_Inited = 1000; const NSUInteger kLengthOfTruncationForLog = 100; @@ -111,6 +112,10 @@ static BOOL sTruncateLongFieldInLogs = YES; connectionLogin = nil; connectionSocket = nil; connectionPassword = nil; + useSSL = NO; + sslKeyFilePath = nil; + sslCertificatePath = nil; + sslCACertificatePath = nil; keepAliveThread = NULL; lastKeepAliveTime = 0; pingThread = NULL; @@ -298,6 +303,29 @@ static BOOL sTruncateLongFieldInLogs = YES; return YES; } +/** + * Set the connection to establish secure connections using SSL; must be + * called before connect:. + * This will always attempt to activate SSL if set, but depending on server + * setup connection may sometimes proceed without SSL enabled even if requested; + * it is suggested that after connection, -[MCPConnection isConnectedViaSSL] + * is checked to determine whether SSL is actually active. + */ +- (void) setSSL:(BOOL)shouldUseSSL usingKeyFilePath:(NSString *)keyFilePath certificatePath:(NSString *)certificatePath certificateAuthorityCertificatePath:(NSString *)caCertificatePath +{ + useSSL = shouldUseSSL; + + // Reset the old SSL details + if (sslKeyFilePath) [sslKeyFilePath release], sslKeyFilePath = nil; + if (sslCertificatePath) [sslCertificatePath release], sslCertificatePath = nil; + if (sslCACertificatePath) [sslCACertificatePath release], sslCACertificatePath = nil; + + // Set new details if provided + if (keyFilePath) sslKeyFilePath = [[NSString alloc] initWithString:[keyFilePath stringByExpandingTildeInPath]]; + if (certificatePath) sslCertificatePath = [[NSString alloc] initWithString:[certificatePath stringByExpandingTildeInPath]]; + if (caCertificatePath) sslCACertificatePath = [[NSString alloc] initWithString:[caCertificatePath stringByExpandingTildeInPath]]; +} + #pragma mark - #pragma mark Connection proxy @@ -385,7 +413,18 @@ static BOOL sTruncateLongFieldInLogs = YES; } else { theSocket = [self cStringFromString:connectionSocket]; } - + + // Apply SSL if appropriate + if (useSSL) { + NSLog(@"sdfsdfsfds SET"); + mysql_ssl_set(mConnection, + sslKeyFilePath ? [sslKeyFilePath UTF8String] : NULL, + sslCertificatePath ? [sslCertificatePath UTF8String] : NULL, + sslCACertificatePath ? [sslCACertificatePath UTF8String] : NULL, + NULL, + kMCPSSLCipherList); + } + // Select the password from the provided method if (!connectionPassword) { if (delegate && [delegate respondsToSelector:@selector(keychainPasswordForConnection:)]) { @@ -406,7 +445,7 @@ static BOOL sTruncateLongFieldInLogs = YES; return mConnected = NO; } - + mConnected = YES; userTriggeredDisconnect = NO; connectionStartTime = mach_absolute_time(); @@ -626,6 +665,15 @@ static BOOL sTruncateLongFieldInLogs = YES; return mConnected; } +/** + * Returns YES if the MCPConnection is connected to a server via SSL, NO otherwise. + */ +- (BOOL)isConnectedViaSSL +{ + if (![self isConnected]) return NO; + return (mysql_get_ssl_cipher(mConnection))?YES:NO; +} + /** * Returns YES if the user chose to disconnect at the last "connection failure" * prompt, NO otherwise. @@ -1255,6 +1303,16 @@ void performThreadedKeepAlive(void *ptr) if (theSocket == NULL) { theSocket = kMCPConnectionDefaultSocket; } + + // Apply SSL if appropriate + if (useSSL) { + mysql_ssl_set(mConnection, + sslKeyFilePath ? [sslKeyFilePath UTF8String] : NULL, + sslCertificatePath ? [sslCertificatePath UTF8String] : NULL, + sslCACertificatePath ? [sslCACertificatePath UTF8String] : NULL, + NULL, + kMCPSSLCipherList); + } theRet = mysql_real_connect(mConnection, theHost, theLogin, thePass, NULL, port, theSocket, mConnectionFlags); if (theRet != mConnection) { @@ -1833,6 +1891,14 @@ void performThreadedKeepAlive(void *ptr) } else { thePass = [self cStringFromString:connectionPassword]; } + if (useSSL) { + mysql_ssl_set(mConnection, + sslKeyFilePath ? [sslKeyFilePath UTF8String] : NULL, + sslCertificatePath ? [sslCertificatePath UTF8String] : NULL, + sslCACertificatePath ? [sslCACertificatePath UTF8String] : NULL, + NULL, + kMCPSSLCipherList); + } // Connect connectionSetupStatus = mysql_real_connect(killerConnection, theHost, theLogin, thePass, NULL, connectionPort, theSocket, mConnectionFlags); @@ -1850,13 +1916,18 @@ void performThreadedKeepAlive(void *ptr) NSData *encodedKillQueryData = NSStringDataUsingLossyEncoding(killQueryString, killerConnectionEncoding, 1); const char *killQueryCString = [encodedKillQueryData bytes]; unsigned long killQueryCStringLength = [encodedKillQueryData length]; - if (mysql_real_query(killerConnection, killQueryCString, killQueryCStringLength) == 0) { - mysql_close(killerConnection); + int killerReturnError = mysql_real_query(killerConnection, killQueryCString, killQueryCStringLength); + mysql_close(killerConnection); + if (killerReturnError == 0) { queryCancelUsedReconnect = NO; return; } - mysql_close(killerConnection); + NSLog(@"Task cancellation: kill query failed (Returned status %d)", killerReturnError); + } else { + NSLog(@"Task cancellation connection failed (error %u)", mysql_errno(killerConnection)); } + } else { + NSLog(@"Task cancelletion MySQL init failed."); } // Reset the connection @@ -2333,6 +2404,14 @@ void performThreadedKeepAlive(void *ptr) } else { theSocket = [self cStringFromString:connectionSocket]; } + if (useSSL) { + mysql_ssl_set(mConnection, + sslKeyFilePath ? [sslKeyFilePath UTF8String] : NULL, + sslCertificatePath ? [sslCertificatePath UTF8String] : NULL, + sslCACertificatePath ? [sslCACertificatePath UTF8String] : NULL, + NULL, + kMCPSSLCipherList); + } if (!connectionPassword) { if (delegate && [delegate respondsToSelector:@selector(keychainPasswordForConnection:)]) { thePass = [self cStringFromString:[delegate keychainPasswordForConnection:self]]; @@ -3135,6 +3214,9 @@ void performThreadedKeepAlive(void *ptr) if (connectionLogin) [connectionLogin release]; if (connectionSocket) [connectionSocket release]; if (connectionPassword) [connectionPassword release]; + if (sslKeyFilePath) [sslKeyFilePath release]; + if (sslCertificatePath) [sslCertificatePath release]; + if (sslCACertificatePath) [sslCACertificatePath release]; if (serverVersionString) [serverVersionString release], serverVersionString = nil; if (structure) [structure release], structure = nil; if (allKeysofDbStructure) [allKeysofDbStructure release], allKeysofDbStructure = nil; diff --git a/Frameworks/MCPKit/MySQL/include/mysql.h b/Frameworks/MCPKit/MySQL/include/mysql.h index d114afb6..dcf3e167 100644 --- a/Frameworks/MCPKit/MySQL/include/mysql.h +++ b/Frameworks/MCPKit/MySQL/include/mysql.h @@ -44,7 +44,9 @@ extern "C" { #endif #ifndef _global_h /* If not standard header */ +#ifndef MYSQL_ABI_CHECK #include +#endif #ifdef __LCC__ #include /* For windows */ #endif diff --git a/Frameworks/MCPKit/MySQL/include/mysql_com.h b/Frameworks/MCPKit/MySQL/include/mysql_com.h index db5a5eb8..7d3dd3d4 100644 --- a/Frameworks/MCPKit/MySQL/include/mysql_com.h +++ b/Frameworks/MCPKit/MySQL/include/mysql_com.h @@ -277,6 +277,16 @@ typedef struct st_net { /** Client library sqlstate buffer. Set along with the error message. */ char sqlstate[SQLSTATE_LENGTH+1]; void *extension; +#if defined(MYSQL_SERVER) && !defined(EMBEDDED_LIBRARY) + /* + Controls whether a big packet should be skipped. + + Initially set to FALSE by default. Unauthenticated sessions must have + this set to FALSE so that the server can't be tricked to read packets + indefinitely. + */ + my_bool skip_big_packet; +#endif } NET; diff --git a/Frameworks/MCPKit/MySQL/include/mysql_version.h b/Frameworks/MCPKit/MySQL/include/mysql_version.h index 7017707c..736c2021 100644 --- a/Frameworks/MCPKit/MySQL/include/mysql_version.h +++ b/Frameworks/MCPKit/MySQL/include/mysql_version.h @@ -9,11 +9,11 @@ #include #else #define PROTOCOL_VERSION 10 -#define MYSQL_SERVER_VERSION "5.1.46" +#define MYSQL_SERVER_VERSION "5.1.50" #define MYSQL_BASE_VERSION "mysqld-5.1" #define MYSQL_SERVER_SUFFIX_DEF "" #define FRM_VER 6 -#define MYSQL_VERSION_ID 50146 +#define MYSQL_VERSION_ID 50150 #define MYSQL_PORT 3306 #define MYSQL_PORT_DEFAULT 0 #define MYSQL_UNIX_ADDR "/tmp/mysql.sock" diff --git a/Frameworks/MCPKit/MySQL/lib/libmysqlclient.a b/Frameworks/MCPKit/MySQL/lib/libmysqlclient.a index 512d3b52..ab6939c1 100644 Binary files a/Frameworks/MCPKit/MySQL/lib/libmysqlclient.a and b/Frameworks/MCPKit/MySQL/lib/libmysqlclient.a differ diff --git a/Frameworks/MCPKit/MySQL/lib/libmysqlclient_r.a b/Frameworks/MCPKit/MySQL/lib/libmysqlclient_r.a index a9ae37fe..b04f6c35 100644 Binary files a/Frameworks/MCPKit/MySQL/lib/libmysqlclient_r.a and b/Frameworks/MCPKit/MySQL/lib/libmysqlclient_r.a differ diff --git a/Interfaces/English.lproj/ConnectionView.xib b/Interfaces/English.lproj/ConnectionView.xib index f61c82e7..6ef08db6 100644 --- a/Interfaces/English.lproj/ConnectionView.xib +++ b/Interfaces/English.lproj/ConnectionView.xib @@ -22,7 +22,6 @@ YES - YES @@ -123,7 +122,7 @@ 3 MQA - + 2 @@ -424,21 +423,48 @@ 269 YES - + 268 - {{110, 149}, {226, 22}} + {{108, 10}, {230, 18}} YES - - -1804468671 - 272630784 - + + 67239424 + 0 + Connect using SSL LucidaGrande 13 1044 + + 1211912703 + 2 + + NSImage + NSSwitch + + + NSSwitch + + + + 200 + 25 + + + + + 268 + {{110, 174}, {226, 22}} + + YES + + -1804468671 + 272630784 + + YES @@ -461,7 +487,7 @@ 268 - {{7, 151}, {98, 17}} + {{7, 176}, {98, 17}} YES @@ -485,7 +511,7 @@ 268 - {{110, 183}, {226, 22}} + {{110, 208}, {226, 22}} YES @@ -503,7 +529,7 @@ 268 - {{7, 185}, {98, 17}} + {{7, 210}, {98, 17}} YES @@ -519,7 +545,7 @@ 268 - {{110, 115}, {226, 22}} + {{110, 140}, {226, 22}} YES @@ -536,7 +562,7 @@ 268 - {{7, 117}, {98, 17}} + {{7, 142}, {98, 17}} YES @@ -552,7 +578,7 @@ 268 - {{110, 81}, {226, 22}} + {{110, 106}, {226, 22}} YES @@ -569,7 +595,7 @@ 268 - {{7, 83}, {98, 17}} + {{7, 108}, {98, 17}} YES @@ -585,7 +611,7 @@ 268 - {{110, 47}, {226, 22}} + {{110, 72}, {226, 22}} YES @@ -603,7 +629,7 @@ 268 - {{7, 49}, {98, 17}} + {{7, 74}, {98, 17}} YES @@ -619,7 +645,7 @@ 268 - {{110, 13}, {226, 22}} + {{110, 38}, {226, 22}} YES @@ -637,7 +663,7 @@ 268 - {{7, 15}, {98, 17}} + {{7, 40}, {98, 17}} YES @@ -651,7 +677,196 @@ - {{6, 156}, {356, 232}} + {{6, 131}, {356, 257}} + + NSView + + + + 268 + + YES + + + 268 + {{-3, 15}, {107, 17}} + + YES + + 68288064 + 71304192 + CA Cert: + + + + + + + + + 268 + {{109, 13}, {199, 22}} + + YES + + -2073952703 + 272631296 + + + none set + + YES + + + 3 + MC41AA + + + + + + + 268 + {{307, 12}, {29, 24}} + + YES + + 67239424 + 134217728 + + + + -922992385 + 34 + + NSImage + KeyTemplate + + + + 400 + 75 + + + + + 268 + {{-3, 49}, {107, 17}} + + YES + + 68288064 + 71304192 + Certificate: + + + + + + + + + 268 + {{109, 47}, {199, 22}} + + YES + + -2073952703 + 272631296 + + + none set + + YES + + + 3 + MC41AA + + + + + + + 268 + {{307, 46}, {29, 24}} + + YES + + 67239424 + 134217728 + + + + -922992385 + 34 + + + + 400 + 75 + + + + + 268 + {{-3, 83}, {107, 17}} + + YES + + 68288064 + 71304192 + Key File: + + + + + + + + + 268 + {{109, 81}, {199, 22}} + + YES + + -2073952703 + 272631296 + + + none set + + YES + + + 3 + MC41MDQwMzIyNTgxAA + + + + + + 268 + {{307, 80}, {29, 24}} + + YES + + 67239424 + 134217728 + + + + -922992385 + 34 + + + + 400 + 75 + + + + {{6, 28}, {356, 104}} NSView @@ -665,7 +880,7 @@ 2 - + 256 YES @@ -674,10 +889,32 @@ 269 YES + + + 268 + {{108, 11}, {230, 18}} + + YES + + 67239424 + 0 + Connect using SSL + + + 1211912703 + 2 + + + + + 200 + 25 + + 268 - {{110, 115}, {226, 22}} + {{110, 141}, {226, 22}} YES @@ -694,7 +931,7 @@ 268 - {{7, 117}, {98, 17}} + {{7, 143}, {98, 17}} YES @@ -710,7 +947,7 @@ 268 - {{110, 81}, {226, 22}} + {{110, 107}, {226, 22}} YES @@ -727,7 +964,7 @@ 268 - {{7, 83}, {98, 17}} + {{7, 109}, {98, 17}} YES @@ -743,7 +980,7 @@ 268 - {{110, 47}, {226, 22}} + {{110, 73}, {226, 22}} YES @@ -761,7 +998,7 @@ 268 - {{7, 49}, {98, 17}} + {{7, 75}, {98, 17}} YES @@ -777,7 +1014,7 @@ 268 - {{110, 13}, {226, 22}} + {{110, 39}, {226, 22}} YES @@ -795,7 +1032,7 @@ 268 - {{7, 15}, {98, 17}} + {{7, 41}, {98, 17}} YES @@ -811,7 +1048,7 @@ 268 - {{110, 149}, {226, 22}} + {{110, 175}, {226, 22}} YES @@ -829,7 +1066,7 @@ 268 - {{7, 151}, {98, 17}} + {{7, 177}, {98, 17}} YES @@ -843,117 +1080,304 @@ - {{6, 190}, {356, 198}} + {{6, 164}, {356, 224}} NSView - - {{10, 33}, {360, 371}} - - Socket - - - - - Item 2 - - - 256 - - YES - - - 269 + + + 268 YES - - - 268 - {{110, 299}, {226, 22}} - - YES - - -1804468671 - 272630784 - - - - YES - - - - - - + + 268 - {{7, 301}, {98, 17}} - + {{-3, 15}, {107, 17}} + YES - + 68288064 71304192 - MySQL Host: + CA Cert: - + - - + + 268 - {{110, 265}, {226, 22}} - + {{109, 13}, {199, 22}} + YES - - -1804468671 - 272630784 + + -2073952703 + 272631296 - + none set + YES - + + 3 + MC41AA + + - - + + 268 - {{7, 267}, {98, 17}} - + {{307, 12}, {29, 24}} + YES - + + 67239424 + 134217728 + + + + -922992385 + 34 + + + + 400 + 75 + + + + + 268 + {{-3, 49}, {107, 17}} + + YES + 68288064 71304192 - Username: + Certificate: - + - - + + 268 - {{110, 231}, {226, 22}} - + {{109, 47}, {199, 22}} + YES - - -1804468671 - 272630784 + + -2073952703 + 272631296 - + none set + YES - + + 3 + MC41AA + + - - + + 268 - {{7, 233}, {98, 17}} - + {{307, 46}, {29, 24}} + + YES + + 67239424 + 134217728 + + + + -922992385 + 34 + + + + 400 + 75 + + + + + 268 + {{-3, 83}, {107, 17}} + + YES + + 68288064 + 71304192 + Key File: + + + + + + + + + 268 + {{109, 81}, {199, 22}} + + YES + + -2073952703 + 272631296 + + + none set + + YES + + + 3 + MC41MDQwMzIyNTgxAA + + + + + + 268 + {{307, 80}, {29, 24}} + + YES + + 67239424 + 134217728 + + + + -922992385 + 34 + + + + 400 + 75 + + + + {{6, 61}, {356, 104}} + + NSView + + + {{10, 33}, {360, 371}} + + + Socket + + + + + Item 2 + + + 256 + + YES + + + 269 + + YES + + + 268 + {{110, 299}, {226, 22}} + + YES + + -1804468671 + 272630784 + + + + YES + + + + + + + 268 + {{7, 301}, {98, 17}} + + YES + + 68288064 + 71304192 + MySQL Host: + + + + + + + + + 268 + {{110, 265}, {226, 22}} + + YES + + -1804468671 + 272630784 + + + + YES + + + + + + + 268 + {{7, 267}, {98, 17}} + + YES + + 68288064 + 71304192 + Username: + + + + + + + + + 268 + {{110, 231}, {226, 22}} + + YES + + -1804468671 + 272630784 + + + + YES + + + + + + + 268 + {{7, 233}, {98, 17}} + YES 68288064 @@ -1214,10 +1638,7 @@ -922992385 34 - - NSImage - KeyTemplate - + 400 @@ -1267,21 +1688,20 @@ {{10, 33}, {360, 371}} - SSH - + 0 YES YES YES - + @@ -1807,7 +2227,7 @@ - + 274 YES @@ -1829,7 +2249,84 @@ {579, 51} + NSView + + + + 274 + + YES + + + 274 + {{2, 10}, {575, 17}} + + YES + + 67239424 + 138674176 + Please select the SSL key file to use when establishing a secure connection. + + + + + + + + {579, 34} + NSView + + + + 274 + + YES + + + 274 + {{2, 10}, {575, 17}} + + YES + + 67239424 + 138674176 + Please select the client SSL certificate file to use when establishing a secure connection. + + + + + + + + {579, 34} + NSView + + + + 274 + + YES + + + 274 + {{2, 10}, {575, 34}} + + + YES + + 67239424 + 138674176 + Please select the client SSL Certificate Authority certificate to use when establishing a secure connection. This must be the same as the server CA certificate. + + + + + + + + {579, 51} + NSView @@ -2879,14 +3376,6 @@ 5494 - - - chooseSSHKey: - - - - 5495 - value: sshPassword @@ -3111,40 +3600,750 @@ 5592 - - - - YES - - 0 - - - - - - -1 - - - First Responder - - - 4826 - - - YES - - - - ConnectionView - - - -2 - - - File's Owner + + + standardConnectionSSLDetailsContainer + + - - -3 + 5620 + + + + value: useSSL + + + + + + value: useSSL + value + useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + + + YES + + + + + + + 2 + + + 5627 + + + + toolTip: sslCACertFileLocation + + + + + + toolTip: sslCACertFileLocation + toolTip + sslCACertFileLocation + 2 + + + 5637 + + + + toolTip: sslCertificateFileLocation + + + + + + toolTip: sslCertificateFileLocation + toolTip + sslCertificateFileLocation + 2 + + + 5639 + + + + toolTip: sslKeyFileLocation + + + + + + toolTip: sslKeyFileLocation + toolTip + sslKeyFileLocation + 2 + + + 5641 + + + + hidden: useSSL + + + + + + hidden: useSSL + hidden + useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 5649 + + + + updateSSLInterface: + + + + 5651 + + + + chooseKeyLocation: + + + + 5661 + + + + chooseKeyLocation: + + + + 5662 + + + + chooseKeyLocation: + + + + 5663 + + + + chooseKeyLocation: + + + + 5664 + + + + standardSSLKeyFileButton + + + + 5665 + + + + standardSSLCertificateButton + + + + 5666 + + + + standardSSLCACertButton + + + + 5667 + + + + sslKeyFileLocationHelp + + + + 5671 + + + + value: sslKeyFileLocationEnabled + + + + + + value: sslKeyFileLocationEnabled + value + sslKeyFileLocationEnabled + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + + + YES + + + + + + + 2 + + + 5673 + + + + value: sslCertificateFileLocationEnabled + + + + + + value: sslCertificateFileLocationEnabled + value + sslCertificateFileLocationEnabled + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + + + YES + + + + + + + 2 + + + 5677 + + + + value: sslCACertFileLocationEnabled + + + + + + value: sslCACertFileLocationEnabled + value + sslCACertFileLocationEnabled + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + + + YES + + + + + + + 2 + + + 5679 + + + + sslCACertLocationHelp + + + + 5686 + + + + sslCertificateLocationHelp + + + + 5687 + + + + value: sslCertificateFileLocationEnabled + + + + + + value: sslCertificateFileLocationEnabled + value + sslCertificateFileLocationEnabled + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + + + YES + + + + + + + 2 + + + 5707 + + + + toolTip: sslCertificateFileLocation + + + + + + toolTip: sslCertificateFileLocation + toolTip + sslCertificateFileLocation + 2 + + + 5708 + + + + hidden: useSSL + + + + + + hidden: useSSL + hidden + useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 5710 + + + + value: sslKeyFileLocationEnabled + + + + + + value: sslKeyFileLocationEnabled + value + sslKeyFileLocationEnabled + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + + + YES + + + + + + + 2 + + + 5711 + + + + toolTip: sslCACertFileLocation + + + + + + toolTip: sslCACertFileLocation + toolTip + sslCACertFileLocation + 2 + + + 5712 + + + + toolTip: sslKeyFileLocation + + + + + + toolTip: sslKeyFileLocation + toolTip + sslKeyFileLocation + 2 + + + 5714 + + + + value: sslCACertFileLocationEnabled + + + + + + value: sslCACertFileLocationEnabled + value + sslCACertFileLocationEnabled + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + + + YES + + + + + + + 2 + + + 5715 + + + + chooseKeyLocation: + + + + 5717 + + + + chooseKeyLocation: + + + + 5718 + + + + chooseKeyLocation: + + + + 5719 + + + + value: useSSL + + + + + + value: useSSL + value + useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + + + YES + + + + + + + 2 + + + 5722 + + + + updateSSLInterface: + + + + 5723 + + + + socketConnectionSSLDetailsContainer + + + + 5724 + + + + socketSSLCACertButton + + + + 5725 + + + + socketSSLCertificateButton + + + + 5726 + + + + socketSSLKeyFileButton + + + + 5727 + + + + value: sslCACertFileLocation + + + + + + value: sslCACertFileLocation + value + sslCACertFileLocation + + NSNullPlaceholder + none set + + 2 + + + 5730 + + + + value: sslCertificateFileLocation + + + + + + value: sslCertificateFileLocation + value + sslCertificateFileLocation + + NSNullPlaceholder + none set + + 2 + + + 5731 + + + + value: sslKeyFileLocation + + + + + + value: sslKeyFileLocation + value + sslKeyFileLocation + + NSNullPlaceholder + none set + + 2 + + + 5732 + + + + value: sslKeyFileLocation + + + + + + value: sslKeyFileLocation + value + sslKeyFileLocation + + NSNullPlaceholder + none set + + 2 + + + 5733 + + + + value: sslCACertFileLocation + + + + + + value: sslCACertFileLocation + value + sslCACertFileLocation + + NSNullPlaceholder + none set + + 2 + + + 5734 + + + + value: sslCertificateFileLocation + + + + + + value: sslCertificateFileLocation + value + sslCertificateFileLocation + + NSNullPlaceholder + none set + + 2 + + + 5735 + + + + + YES + + 0 + + + + + + -1 + + + First Responder + + + 4826 + + + YES + + + + ConnectionView + + + -2 + + + File's Owner + + + -3 Application @@ -3467,837 +4666,1227 @@ YES - + + + + 5423 + + + YES + + + + + + 5422 + + + + + 5159 + + + YES + + + + + + 5157 + + + YES + + + + + + 4980 + + + YES + + + + + + + + 4981 + + + YES + + + + + + 4982 + + + YES + + + + + + 4985 + + + YES + + + + + + 4986 + + + YES + + + + + + 5166 + + + YES + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5404 + + + YES + + + + + + 5403 + + + YES + + + + + + 5291 + + + YES + + + + + + 5290 + + + YES + + + + + + 5289 + + + YES + + + + + + 5288 + + + YES + + + + + + 5287 + + + YES + + + + + + 5286 + + + YES + + + + + + 5285 + + + YES + + + + + + 5284 + + + YES + + + + + + 5273 + + + YES + + + + + + 5272 + + + YES + + + + + + 5271 + + + YES + + + + + + 5270 + + + YES + + + + + + 5269 + + + YES + + + - 5423 - + 5268 + YES - + - + - 5422 - - + 5267 + + + YES + + + - 5159 - + 5266 + YES - + - + - 5157 - + 5265 + YES - + - + - 4980 - + 5264 + YES - - - + - + - 4981 - + 5492 + YES - + - + - 4982 - + 5523 + YES - + - + - 4985 - + 5525 + YES - + - + - 4986 - + 5526 + + + + + 5524 + + + + + 5493 + + + + + 5283 + + + + + 5282 + + + + + 5281 + + + + + 5280 + + + + + 5279 + + + + + 5278 + + + + + 5277 + + + + + 5276 + + + + + 5275 + + + + + 5274 + + + + + 5299 + + + + + 5298 + + + + + 5297 + + + + + 5296 + + + + + 5295 + + + + + 5294 + + + + + 5293 + + + + + 5292 + + + + + 5406 + + + + + 5405 + + + + + 4983 + YES - + + - + - 5166 - + 5162 + YES - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + - + - 5404 - + 5218 + YES - + - + - 5403 - + 5386 + YES - + - + - 5291 - + 5385 + YES - + - + - 5290 - + 5219 + YES - + - + - 5289 - + 5217 + YES - + - + - 5288 - + 5216 + YES - + - + - 5287 - + 5215 + YES - + - + - 5286 - + 5214 + YES - + - + - 5285 - + 5213 + YES - + - + - 5284 - + 5212 + YES - + - + - 5273 - + 5227 + + + + + 5226 + + + + + 5225 + + + + + 5224 + + + + + 5223 + + + + + 5222 + + + + + 5220 + + + + + 5388 + + + + + 5387 + + + + + 5221 + + + + + 4984 + YES - + + - + - 5272 - + 5156 + YES - + + + + + + + + + + + + + - + - 5271 - + 5377 + YES - + - + - 5270 - + 5376 + YES - + - + - 5269 - + 5188 + YES - + - + - 5268 - + 5187 + YES - + - + - 5267 - + 5184 + YES - + - + - 5266 - + 5183 + YES - + - + - 5265 - + 5180 + YES - + - + - 5264 - + 5179 + YES - + - + - 5492 - + 5176 + YES - + - + - 5523 - + 5175 + YES - + - + - 5525 - + 5173 + YES - + - - - - 5526 - - - - - 5524 - - - - - 5493 - - - - - 5283 - - - - - 5282 - - - - - 5281 - - + - 5280 - - + 5171 + + + YES + + + - 5279 - - + 5172 + + - 5278 - - + 5174 + + - 5277 - - + 5178 + + - 5276 - - + 5177 + + - 5275 - - + 5182 + + - 5274 - - + 5181 + + - 5299 - - + 5186 + + - 5298 - - + 5185 + + - 5297 - - + 5190 + + - 5296 - - + 5189 + + - 5295 - - + 5379 + + - 5294 - - + 5378 + + - 5293 - - + 5158 + + - 5292 - - + 5160 + + - 5406 - - + 5424 + + - 5405 - - + 4839 + + - 4983 - + 5154 + YES - + - + - 5162 - - - YES - - - - - - - - - - - - + 5155 + + - 5218 - + 5593 + YES - + - + - 5386 - - - YES - - - + 5594 + + - 5385 - + 5595 + YES - + + + + + + + + + - + - 5219 - + 5596 + YES - + - + - 5217 - - - YES - - - + 5597 + + - 5216 - + 5598 + YES - + - + - 5215 - + 5599 + + + + + 5600 + YES - + - + - 5214 - + 5601 + + + + + 5604 + YES - + - + - 5213 - + 5605 + YES - + - + - 5212 - + 5606 + YES - + - - - - 5227 - - + - 5226 - - + 5607 + + - 5225 - - + 5608 + + - 5224 - - + 5609 + + - 5223 - - + 5612 + + + YES + + + - 5222 - - + 5613 + + + YES + + + - 5220 - - + 5614 + + + YES + + + - 5388 - - + 5615 + + - 5387 - - + 5616 + + - 5221 - - + 5617 + + - 4984 - + 5668 + YES - + - + + SSL Key File Selection Help - 5156 - + 5669 + YES - - - - - - - - - - - - + - + - 5377 - + 5670 + + + + + 5680 + YES - + - + + SSL CA Cert File Selection Help - 5376 - + 5681 + YES - + - + - 5188 - + 5682 + + + + + 5683 + YES - + - + + SSL Certificate File Selection Help - 5187 - + 5684 + YES - + - + - 5184 - + 5685 + + + + + 5688 + YES - + + + + + + + + + - + - 5183 - + 5689 + YES - + - + - 5180 - + 5690 + YES - + - + - 5179 - + 5691 + YES - + - + - 5176 - + 5692 + YES - + - + - 5175 - + 5693 + YES - + - + - 5173 - + 5694 + YES - + - + - 5171 - + 5695 + YES - + - - - - 5172 - - - - - 5174 - - - - - 5178 - - - - - 5177 - - - - - 5182 - - + - 5181 - - + 5696 + + + YES + + + - 5186 - - + 5697 + + + YES + + + - 5185 - - + 5698 + + - 5190 - - + 5699 + + - 5189 - - + 5700 + + - 5379 - - + 5701 + + - 5378 - - + 5702 + + - 5158 - - + 5703 + + - 5160 - - + 5704 + + - 5424 - - + 5705 + + - 4839 - - + 5706 + + - 5154 - + 5720 + YES - + - + - 5155 - - + 5721 + + @@ -4501,12 +6090,75 @@ 5576.IBPluginDependency 5577.IBPluginDependency 5578.IBPluginDependency + 5588.IBPluginDependency + 5589.IBPluginDependency + 5590.IBPluginDependency + 5593.IBPluginDependency + 5594.IBPluginDependency + 5595.IBPluginDependency + 5596.IBPluginDependency + 5597.IBPluginDependency + 5598.IBPluginDependency + 5599.IBPluginDependency + 5600.IBAttributePlaceholdersKey + 5600.IBPluginDependency + 5601.IBPluginDependency + 5604.IBAttributePlaceholdersKey + 5604.IBPluginDependency + 5605.IBPluginDependency + 5606.IBPluginDependency + 5607.IBPluginDependency + 5608.IBPluginDependency + 5609.IBPluginDependency + 5612.IBAttributePlaceholdersKey + 5612.IBPluginDependency + 5613.IBPluginDependency + 5614.IBPluginDependency + 5615.IBPluginDependency + 5616.IBPluginDependency + 5617.IBPluginDependency + 5668.IBEditorWindowLastContentRect + 5668.IBPluginDependency + 5669.IBPluginDependency + 5670.IBPluginDependency + 5680.IBEditorWindowLastContentRect + 5680.IBPluginDependency + 5681.IBPluginDependency + 5682.IBPluginDependency + 5683.IBEditorWindowLastContentRect + 5683.IBPluginDependency + 5684.IBPluginDependency + 5685.IBPluginDependency + 5688.IBPluginDependency + 5689.IBPluginDependency + 5690.IBPluginDependency + 5691.IBAttributePlaceholdersKey + 5691.IBPluginDependency + 5692.IBPluginDependency + 5693.IBPluginDependency + 5694.IBAttributePlaceholdersKey + 5694.IBPluginDependency + 5695.IBAttributePlaceholdersKey + 5695.IBPluginDependency + 5696.IBPluginDependency + 5697.IBPluginDependency + 5698.IBPluginDependency + 5699.IBPluginDependency + 5700.IBPluginDependency + 5701.IBPluginDependency + 5702.IBPluginDependency + 5703.IBPluginDependency + 5704.IBPluginDependency + 5705.IBPluginDependency + 5706.IBPluginDependency + 5720.IBPluginDependency + 5721.IBPluginDependency YES com.apple.InterfaceBuilder.CocoaPlugin - {{118, 243}, {882, 475}} + {{126, 318}, {882, 475}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -4881,6 +6533,111 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Click to choose the SSL key file to use when establishing a secure connection + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Click to choose the client SSL certificate file to use when establishing a secure connection + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Click to choose the client SSL Certificate Authority certificate to use when establishing a secure connection + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{245, 483}, {579, 34}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{245, 466}, {579, 51}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{245, 483}, {579, 34}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Choose a custom SSH key file to use with this connection. Standard locations like ~/.ssh are checked automatically. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Choose a custom SSH key file to use with this connection. Standard locations like ~/.ssh are checked automatically. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Choose a custom SSH key file to use with this connection. Standard locations like ~/.ssh are checked automatically. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin @@ -4899,7 +6656,7 @@ - 5592 + 5735 @@ -5139,13 +6896,14 @@ YES addFavorite: cancelMySQLConnection: - chooseSSHKey: + chooseKeyLocation: editFavorites: initiateConnection: reverseSortFavorites: showHelp: sortFavorites: updateFavoriteSelection: + updateSSLInterface: YES @@ -5158,6 +6916,7 @@ id id id + id @@ -5166,13 +6925,14 @@ YES addFavorite: cancelMySQLConnection: - chooseSSHKey: + chooseKeyLocation: editFavorites: initiateConnection: reverseSortFavorites: showHelp: sortFavorites: updateFavoriteSelection: + updateSSLInterface: YES @@ -5185,7 +6945,7 @@ id - chooseSSHKey: + chooseKeyLocation: id @@ -5212,6 +6972,10 @@ updateFavoriteSelection: id + + updateSSLInterface: + id + @@ -5234,16 +6998,27 @@ progressIndicator progressIndicatorText socketConnectionFormContainer + socketConnectionSSLDetailsContainer socketPasswordField + socketSSLCACertButton + socketSSLCertificateButton + socketSSLKeyFileButton sshConnectionFormContainer sshKeyLocationHelp sshPasswordField sshSQLHostField sshSSHKeyButton sshSSHPasswordField + sslCACertLocationHelp + sslCertificateLocationHelp + sslKeyFileLocationHelp standardConnectionFormContainer + standardConnectionSSLDetailsContainer standardPasswordField standardSQLHostField + standardSSLCACertButton + standardSSLCertificateButton + standardSSLKeyFileButton YES @@ -5263,7 +7038,11 @@ NSProgressIndicator NSTextField NSView + NSView NSSecureTextField + NSButton + NSButton + NSButton NSView NSView NSSecureTextField @@ -5271,8 +7050,15 @@ NSButton NSSecureTextField NSView + NSView + NSView + NSView + NSView NSSecureTextField NSTextField + NSButton + NSButton + NSButton @@ -5295,16 +7081,27 @@ progressIndicator progressIndicatorText socketConnectionFormContainer + socketConnectionSSLDetailsContainer socketPasswordField + socketSSLCACertButton + socketSSLCertificateButton + socketSSLKeyFileButton sshConnectionFormContainer sshKeyLocationHelp sshPasswordField sshSQLHostField sshSSHKeyButton sshSSHPasswordField + sslCACertLocationHelp + sslCertificateLocationHelp + sslKeyFileLocationHelp standardConnectionFormContainer + standardConnectionSSLDetailsContainer standardPasswordField standardSQLHostField + standardSSLCACertButton + standardSSLCertificateButton + standardSSLKeyFileButton YES @@ -5372,10 +7169,26 @@ socketConnectionFormContainer NSView + + socketConnectionSSLDetailsContainer + NSView + socketPasswordField NSSecureTextField + + socketSSLCACertButton + NSButton + + + socketSSLCertificateButton + NSButton + + + socketSSLKeyFileButton + NSButton + sshConnectionFormContainer NSView @@ -5400,10 +7213,26 @@ sshSSHPasswordField NSSecureTextField + + sslCACertLocationHelp + NSView + + + sslCertificateLocationHelp + NSView + + + sslKeyFileLocationHelp + NSView + standardConnectionFormContainer NSView + + standardConnectionSSLDetailsContainer + NSView + standardPasswordField NSSecureTextField @@ -5412,6 +7241,18 @@ standardSQLHostField NSTextField + + standardSSLCACertButton + NSButton + + + standardSSLCertificateButton + NSButton + + + standardSSLKeyFileButton + NSButton + @@ -6207,6 +8048,7 @@ NSActionTemplate NSMenuCheckmark NSMenuMixedState + NSSwitch button_edit @@ -6215,6 +8057,7 @@ {10, 10} {9, 8} {7, 2} + {15, 15} {32, 23} diff --git a/Interfaces/English.lproj/DBView.xib b/Interfaces/English.lproj/DBView.xib index 3838f860..1eb04fe7 100644 --- a/Interfaces/English.lproj/DBView.xib +++ b/Interfaces/English.lproj/DBView.xib @@ -18,13 +18,12 @@ YES 788 788 - 1.2.2 + 1.2.5 YES - - + YES @@ -92,6 +91,7 @@ 290 {{5, 2}, {204, 19}} + YES 343014976 @@ -184,6 +184,7 @@ 4362 {218, 38} + YES @@ -273,6 +274,7 @@ {{1, 1}, {218, 38}} + @@ -288,6 +290,7 @@ -2147483392 {{-100, -100}, {15, 8}} + _doScroller: 0.42105263471603394 @@ -297,6 +300,7 @@ -2147483392 {{-100, -100}, {223, 15}} + 1 _doScroller: @@ -305,6 +309,7 @@ {{-1, -13}, {220, 40}} + 2 @@ -315,6 +320,7 @@ {214, 26} + NSView @@ -337,6 +343,7 @@ 4352 {214, 354} + YES @@ -403,6 +410,7 @@ {214, 354} + @@ -413,6 +421,7 @@ -2147483392 {{197, 0}, {15, 292}} + _doScroller: 0.096045196056365967 @@ -423,6 +432,7 @@ -2147483392 {{-100, -100}, {141, 11}} + 257 _doScroller: @@ -431,6 +441,7 @@ {214, 354} + 528 @@ -441,11 +452,13 @@ {{0, 27}, {214, 354}} + NSView {214, 381} + 2 6 @@ -479,6 +492,7 @@ {214, 381} + NSView @@ -501,6 +515,7 @@ 4352 {214, 145} + YES @@ -567,6 +582,7 @@ {214, 145} + @@ -577,6 +593,7 @@ -2147483392 {{-100, -100}, {15, 20}} + _doScroller: 0.48965516686439514 @@ -587,6 +604,7 @@ -2147483392 {{-100, -100}, {141, 11}} + 257 _doScroller: @@ -595,6 +613,7 @@ {214, 145} + 512 @@ -605,11 +624,13 @@ {{0, 382}, {214, 145}} + NSView {{0, 23}, {214, 527}} + 2 NO @@ -660,6 +681,7 @@ 268 {{-1, -1}, {32, 24}} + YES 67239424 @@ -684,6 +706,7 @@ 268 {{30, -1}, {32, 24}} + YES 71433792 @@ -871,6 +894,7 @@ 268 {{61, -1}, {32, 24}} + YES 67239424 @@ -895,6 +919,7 @@ 268 {{92, -1}, {32, 24}} + YES -2080244224 @@ -921,6 +946,7 @@ {{0, 1}, {214, 23}} + YES YES NO @@ -929,6 +955,7 @@ {214, 550} + NSView @@ -941,6 +968,7 @@ 274 {{-7, -10}, {741, 564}} + YES @@ -965,6 +993,7 @@ -2147483356 {{124, -1}, {33, 25}} + YES -2080244224 @@ -999,12 +1028,14 @@ 4352 {694, 289} + YES 256 {694, 17} + @@ -1012,6 +1043,7 @@ -2147483392 {{-26, 0}, {16, 17}} + YES @@ -1572,6 +1604,7 @@ {{1, 17}, {694, 289}} + @@ -1582,6 +1615,7 @@ -2147483392 {{674, 17}, {15, 274}} + _doScroller: 0.9480968713760376 @@ -1591,6 +1625,7 @@ -2147483392 {{1, 291}, {694, 15}} + 1 _doScroller: @@ -1606,6 +1641,7 @@ {{1, 0}, {694, 17}} + @@ -1615,6 +1651,7 @@ {{-1, 22}, {696, 307}} + 562 @@ -1629,6 +1666,7 @@ 292 {{-1, -1}, {32, 25}} + YES -1543373312 @@ -1653,6 +1691,7 @@ 292 {{93, -1}, {32, 25}} + YES -2080244224 @@ -1677,6 +1716,7 @@ 292 {{30, -1}, {32, 25}} + YES -1543373312 @@ -1701,6 +1741,7 @@ 292 {{61, -1}, {32, 25}} + YES -1543373312 @@ -1737,6 +1778,7 @@ {{125, 2}, {538, 23}} + YES 130560 @@ -1757,6 +1799,7 @@ 289 {{663, -1}, {32, 25}} + YES -1543373312 @@ -1779,6 +1822,7 @@ {695, 329} + NSView @@ -1796,6 +1840,7 @@ 268 {{3, 3}, {49, 14}} + YES 68288064 @@ -1834,6 +1879,7 @@ {{678, 4}, {10, 13}} + YES 130560 @@ -1852,6 +1898,7 @@ {{0, 181}, {695, 20}} + 1 MC42NzU3Njg0OTQ2IDAuNzIxOTQ4MTQ2OCAwLjc2NTMwNjExNTIAA @@ -1875,6 +1922,7 @@ NO NO NO + NO 0.0 0.0 @@ -1893,12 +1941,14 @@ 4352 {694, 140} + YES 256 {694, 17} + @@ -1906,6 +1956,7 @@ -2147483392 {{-26, 0}, {16, 17}} + YES @@ -2161,6 +2212,7 @@ {{1, 17}, {694, 140}} + @@ -2171,6 +2223,7 @@ -2147483392 {{611, 17}, {15, 126}} + _doScroller: 0.97794115543365479 @@ -2180,6 +2233,7 @@ -2147483392 {{1, 143}, {610, 15}} + 1 _doScroller: @@ -2194,6 +2248,7 @@ {{1, 0}, {694, 17}} + @@ -2203,6 +2258,7 @@ {{-1, 23}, {696, 158}} + 562 @@ -2217,6 +2273,7 @@ 292 {{-1, 0}, {32, 25}} + YES -1543373312 @@ -2238,6 +2295,7 @@ 292 {{61, 0}, {32, 25}} + YES -2080244224 @@ -2259,6 +2317,7 @@ 292 {{30, 0}, {32, 25}} + YES -1543373312 @@ -2292,6 +2351,7 @@ {{93, 1}, {602, 23}} + YES 130560 @@ -2307,16 +2367,19 @@ {{0, 330}, {695, 201}} + NSView {{7, 10}, {695, 531}} + 2 {{10, 7}, {706, 544}} + Structure @@ -6051,11 +6114,13 @@ {{215, 0}, {729, 550}} + NSView {{0, -1}, {944, 550}} + YES 2 DBViewSplitter @@ -6063,6 +6128,7 @@ {943, 549} + NSView @@ -7075,8 +7141,8 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 YES YES - , - . + . + , NO YES NO @@ -9616,7 +9682,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 NSView - + 265 YES @@ -9635,13 +9701,13 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 NeXT TIFF v4.0 pasteboard type - {{13, -2}, {22, 22}} + {{5, -2}, {101, 22}} YES 130560 33554432 - 0 + 8 0 0 YES @@ -9674,6 +9740,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 {110, 20} + NSView @@ -23331,7 +23398,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{144, 203}, {943, 549}} + {{59, 203}, {943, 549}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin diff --git a/Interfaces/English.lproj/Preferences.xib b/Interfaces/English.lproj/Preferences.xib index 559b2fbc..d5f42095 100644 --- a/Interfaces/English.lproj/Preferences.xib +++ b/Interfaces/English.lproj/Preferences.xib @@ -21,8 +21,8 @@ YES - - + + YES @@ -605,7 +605,7 @@ 12 {{202.5, 176}, {360, 5}} - {{7.5, 0}, {345, 5}} + {{8, 0}, {344, 5}} {0, 0} @@ -1877,14 +1877,14 @@ 1 - + 256 YES 266 - {{119, 153}, {165, 19}} + {{119, 153}, {183, 19}} YES @@ -1902,7 +1902,7 @@ 266 - {{119, 180}, {165, 19}} + {{119, 180}, {183, 19}} YES @@ -1923,7 +1923,7 @@ 266 - {{119, 207}, {165, 19}} + {{119, 207}, {183, 19}} YES @@ -1940,7 +1940,7 @@ 266 - {{119, 126}, {165, 19}} + {{119, 126}, {183, 19}} YES @@ -1958,7 +1958,7 @@ 266 - {{119, 234}, {165, 19}} + {{119, 234}, {183, 19}} YES @@ -2052,8 +2052,212 @@ + + + 268 + {{116, 102}, {188, 18}} + + YES + + 67239424 + 131072 + Connect using SSL + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{277, 75}, {25, 22}} + + YES + + 67239424 + 134348800 + + + + -922992385 + 34 + + NSImage + KeyTemplate + + + + 400 + 75 + + + + + 268 + {{119, 77}, {159, 19}} + + YES + + -2073952703 + 272762368 + + + none set + + YES + + + 3 + MC41MDQwMzIyNTgxAA + + + + + + 268 + {{4, 79}, {110, 14}} + + YES + + 68288064 + 71435264 + Key File: + + + + + + + + + 268 + {{277, 49}, {25, 21}} + + YES + + 67239424 + 134348800 + + + + -922992385 + 34 + + + + 400 + 75 + + + + + 268 + {{119, 50}, {159, 19}} + + YES + + -2073952703 + 272762368 + + + none set + + YES + + + 3 + MC41AA + + 2 + + + + + + + 268 + {{4, 52}, {110, 14}} + + YES + + 68288064 + 71435264 + Certificate: + + + + + + + + + 268 + {{277, 22}, {25, 21}} + + YES + + 67239424 + 134348800 + + + + -922992385 + 34 + + + + 400 + 75 + + + + + 268 + {{119, 23}, {159, 19}} + + YES + + -2073952703 + 272762368 + + + none set + + YES + + + 3 + MC41AA + + + + + + + 268 + {{4, 25}, {110, 14}} + + YES + + 68288064 + 71435264 + CA Cert: + + + + + + - {{10, 7}, {317, 262}} + {{10, 7}, {335, 262}} + Standard @@ -2069,7 +2273,7 @@ 266 - {{119, 180}, {165, 19}} + {{119, 180}, {183, 19}} YES @@ -2087,7 +2291,7 @@ 266 - {{119, 207}, {165, 19}} + {{119, 207}, {183, 19}} YES @@ -2108,7 +2312,7 @@ 266 - {{119, 153}, {165, 19}} + {{119, 153}, {183, 19}} YES @@ -2126,7 +2330,7 @@ 266 - {{119, 234}, {165, 19}} + {{119, 234}, {183, 19}} YES @@ -2204,32 +2408,62 @@ - - {{10, 7}, {317, 262}} - - Socket - - - - - Item 2 - - - 256 - - YES - - - 266 - {{119, 33}, {159, 19}} - + + + 268 + {{116, 129}, {188, 18}} + YES - + + 67239424 + 131072 + Connect using SSL + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{277, 102}, {25, 22}} + + YES + + 67239424 + 134348800 + + + + -922992385 + 34 + + + + 400 + 75 + + + + + 268 + {{119, 104}, {159, 19}} + + YES + -2073952703 - 4326912 + 272762368 - + none set + YES @@ -2238,85 +2472,250 @@ - - + + 268 - {{5, 35}, {109, 14}} - + {{4, 106}, {110, 14}} + YES - + 68288064 - 71304192 - SSH Key: + 71435264 + Key File: - + - - - 265 - {{277, 32}, {25, 21}} - + + + 268 + {{277, 76}, {25, 21}} + YES - + 67239424 134348800 - - -926138113 - 162 - - NSImage - KeyTemplate - + + -922992385 + 34 + 400 75 - - - 266 - {{119, 59}, {183, 19}} - + + + 268 + {{119, 77}, {159, 19}} + YES - - -1804468671 - 4326400 + + -2073952703 + 272762368 - + none set + YES - + + 3 + MC41AA + + - - - 266 - {{119, 33}, {159, 19}} - + + + 268 + {{4, 79}, {110, 14}} + YES - - -1804468671 - 4326400 - + + 68288064 + 71435264 + Certificate: - - YES - - + + + - - - 266 - {{119, 85}, {183, 19}} - + + + 268 + {{277, 49}, {25, 21}} + + YES + + 67239424 + 134348800 + + + + -922992385 + 34 + + + + 400 + 75 + + + + + 268 + {{119, 50}, {159, 19}} + + YES + + -2073952703 + 272762368 + + + none set + + YES + + + 3 + MC41AA + + + + + + + 268 + {{4, 52}, {110, 14}} + + YES + + 68288064 + 71435264 + CA Cert: + + + + + + + + {{10, 7}, {335, 262}} + + Socket + + + + + Item 2 + + + 256 + + YES + + + 266 + {{119, 33}, {159, 19}} + + YES + + -2073952703 + 4326912 + + + + YES + + + 3 + MC41MDQwMzIyNTgxAA + + + + + + 268 + {{5, 35}, {109, 14}} + + YES + + 68288064 + 71304192 + SSH Key: + + + + + + + + + 265 + {{277, 32}, {25, 21}} + + YES + + 67239424 + 134348800 + + + + -926138113 + 162 + + + + 400 + 75 + + + + + 266 + {{119, 59}, {183, 19}} + + YES + + -1804468671 + 4326400 + + + + YES + + + + + + + 266 + {{119, 33}, {159, 19}} + + YES + + -1804468671 + 4326400 + + + + YES + + + + + + + 266 + {{119, 85}, {183, 19}} + YES -1804468671 @@ -2584,20 +2983,19 @@ {{10, 7}, {335, 262}} - SSH - + 134217731 YES YES - + @@ -4247,6 +4645,13 @@ AQAAAAA TableRowCountQueryLevel sshKeyLocationEnabled sshKeyLocation + useSSL + sslKeyFileLocation + sslKeyFileLocationEnabled + sslCertificateFileLocation + sslCertificateFileLocationEnabled + sslCACertFileLocation + sslCACertFileLocationEnabled YES YES @@ -4311,7 +4716,7 @@ AQAAAAA {247, 124} {247, 124} - + 256 YES @@ -4418,7 +4823,6 @@ AQAAAAA {247, 124} - {{0, 0}, {1280, 778}} {247, 146} @@ -4681,6 +5085,82 @@ AQAAAAA {579, 51} NSView + + + 274 + + YES + + + 274 + {{2, 10}, {575, 17}} + + YES + + 67239424 + 138674176 + Please select the SSL key file to use when establishing a secure connection. + + + + + + + + {579, 34} + + NSView + + + + 274 + + YES + + + 274 + {{2, 10}, {575, 17}} + + YES + + 67239424 + 138674176 + Please select the client SSL certificate file to use when establishing a secure connection. + + + + + + + + {579, 34} + NSView + + + + 274 + + YES + + + 274 + {{2, 10}, {575, 34}} + + YES + + 67239424 + 138674176 + Please select the client SSL Certificate Authority certificate to use when establishing a secure connection. This must be the same as the server CA certificate. + + + + + + + + {579, 51} + NSView + @@ -7324,14 +7804,6 @@ AQAAAAA 1871 - - - chooseSSHKey: - - - - 1872 - sshKeyLocationHelp @@ -7340,3005 +7812,4627 @@ AQAAAAA 1876 - - - - YES - - 0 - - - + + + value: selection.useSSL + + + + + + value: selection.useSSL + value + selection.useSSL + + YES + + YES + NSAllowsEditingMultipleValuesSelection + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + + + YES + + + + + + + + 2 + - - -2 - - - File's Owner + 1903 + + + + toolTip: selection.sslKeyFileLocation + + + + + + toolTip: selection.sslKeyFileLocation + toolTip + selection.sslKeyFileLocation + 2 + + + 1907 + + + + value: selection.sslKeyFileLocationEnabled + + + + + + value: selection.sslKeyFileLocationEnabled + value + selection.sslKeyFileLocationEnabled + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + + + YES + + + + + + + 2 + + + 1913 + + + + value: selection.sslCertificateFileLocationEnabled + + + + + + value: selection.sslCertificateFileLocationEnabled + value + selection.sslCertificateFileLocationEnabled + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + + + YES + + + + + + + 2 + + + 1922 + + + + toolTip: selection.sslCertificateFileLocation + + + + + + toolTip: selection.sslCertificateFileLocation + toolTip + selection.sslCertificateFileLocation + 2 + + + 1925 + + + + toolTip: selection.sslCACertFileLocation + + + + + + toolTip: selection.sslCACertFileLocation + toolTip + selection.sslCACertFileLocation + 2 + + + 1928 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 1992 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 1993 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 1994 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 1995 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 1996 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 1997 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 1998 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 1999 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 2000 + + + + value: selection.sslKeyFileLocationEnabled + + + + + + value: selection.sslKeyFileLocationEnabled + value + selection.sslKeyFileLocationEnabled + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + + + YES + + + + + + + 2 + + + 2021 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 2022 + + + + value: selection.useSSL + + + + + + value: selection.useSSL + value + selection.useSSL + + YES + + YES + NSAllowsEditingMultipleValuesSelection + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + + + YES + + + + + + + + 2 + + + 2024 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 2026 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 2027 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 2028 + + + + toolTip: selection.sslCACertFileLocation + + + + + + toolTip: selection.sslCACertFileLocation + toolTip + selection.sslCACertFileLocation + 2 + + + 2029 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 2030 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 2031 + + + + value: selection.sslCertificateFileLocationEnabled + + + + + + value: selection.sslCertificateFileLocationEnabled + value + selection.sslCertificateFileLocationEnabled + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + + + YES + + + + + + + 2 + + + 2033 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 2034 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 2035 + + + + toolTip: selection.sslCertificateFileLocation + + + + + + toolTip: selection.sslCertificateFileLocation + toolTip + selection.sslCertificateFileLocation + 2 + + + 2037 + + + + toolTip: selection.sslKeyFileLocation + + + + + + toolTip: selection.sslKeyFileLocation + toolTip + selection.sslKeyFileLocation + 2 + + + 2038 + + + + hidden: selection.useSSL + + + + + + hidden: selection.useSSL + hidden + selection.useSSL + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + NSValueTransformerName + + + YES + + + + + NSNegateBoolean + + + 2 + + + 2039 + + + + sslKeyFileLocationHelp + + + + 2049 + + + + sslCertificateLocationHelp + + + + 2050 + + + + sslCACertLocationHelp + + + + 2051 + + + + standardSSLKeyFileButton + + + + 2052 + + + + standardSSLCertificateButton + + + + 2053 + + + + standardSSLCACertButton + + + + 2054 + + + + socketSSLCACertButton + + + + 2055 + + + + socketSSLCertificateButton + + + + 2056 + + + + socketSSLKeyFileButton + + + + 2057 + + + + sshSSHKeyButton + + + + 2058 + + + + chooseKeyLocation: + + + + 2059 + + + + chooseKeyLocation: + + + + 2060 + + + + chooseKeyLocation: + + + + 2061 + + + + chooseKeyLocation: + + + + 2062 + + + + chooseKeyLocation: + + + + 2063 + + + + chooseKeyLocation: + + + + 2064 + + + + chooseKeyLocation: + + + + 2065 + + + + value: selection.sslCACertFileLocationEnabled + + + + + + value: selection.sslCACertFileLocationEnabled + value + selection.sslCACertFileLocationEnabled + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + + + YES + + + + + + + 2 + + + 2066 + + + + value: selection.sslCACertFileLocationEnabled + + + + + + value: selection.sslCACertFileLocationEnabled + value + selection.sslCACertFileLocationEnabled + + YES + + YES + NSMultipleValuesPlaceholder + NSNoSelectionPlaceholder + NSNotApplicablePlaceholder + NSNullPlaceholder + + + YES + + + + + + + 2 + + + 2067 + + + + value: selection.sslCACertFileLocation + + + + + + value: selection.sslCACertFileLocation + value + selection.sslCACertFileLocation + + NSNullPlaceholder + none set + + 2 + + + 2068 + + + + value: selection.sslCertificateFileLocation + + + + + + value: selection.sslCertificateFileLocation + value + selection.sslCertificateFileLocation + + NSNullPlaceholder + none set + + 2 + + + 2069 + + + + value: selection.sslKeyFileLocation + + + + + + value: selection.sslKeyFileLocation + value + selection.sslKeyFileLocation + + NSNullPlaceholder + none set + + 2 + + + 2070 + + + + value: selection.sslKeyFileLocation + + + + + + value: selection.sslKeyFileLocation + value + selection.sslKeyFileLocation + + NSNullPlaceholder + none set + + 2 + + + 2071 + + + + value: selection.sslCertificateFileLocation + + + + + + value: selection.sslCertificateFileLocation + value + selection.sslCertificateFileLocation + + NSNullPlaceholder + none set + + 2 + + + 2072 + + + + value: selection.sslCACertFileLocation + + + + + + value: selection.sslCACertFileLocation + value + selection.sslCACertFileLocation + + NSNullPlaceholder + none set + + 2 + + + 2073 + + + + + YES + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 1 + + + YES + + + + PreferencesPanel + + + 2 + + + + + 17 + + + YES + + + + + + + + + + + + + + + + + + + + General + + + 24 + + + YES + + + + + + 25 + + + YES + + + + + + 26 + + + YES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 27 + + + + + 28 + + + + + 29 + + + + + 30 + + + + + 31 + + + + + 32 + + + + + 33 + + + + + 34 + + + + + 35 + + + + + 36 + + + + + 37 + + + + + 38 + + + + + 39 + + + + + 40 + + + + + 41 + + + + + 42 + + + + + 43 + + + + + 44 + + + + + 45 + + + + + 46 + + + + + 47 + + + + + 48 + + + + + 49 + + + + + 50 + + + + + 56 + + + YES + + + + + + + + + + + Notifications + + + 60 + + + YES + + + + + + + + + + + + AutoUpdate + + + 94 + + + YES + + + + + + 95 + + + + + 96 + + + YES + + + + + + 97 + + - -1 - + 98 + + + YES + + + + + + 99 + + + + + 100 + + + YES + + + + + + 101 + + + YES + + + + + + 102 + + + + + 110 + + + YES + + + + + + 111 + + + + + 117 + - First Responder - -3 - + 254 + - Application + Favorites - 1 - + 331 + + + Updater + + + 345 + YES - + - - PreferencesPanel + - 2 - - + 346 + + - 17 - + 400 + YES - - - - - - - - - - - - - - - - - + - General + Favorites - 24 - + 401 + YES - + + - + - 25 - + 402 + YES - + + - + - 26 - + 403 + YES - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - + + + + 406 + + + YES + + + + + + + + 407 + + + + + 408 + + + + + 409 + + + YES + + + + + + + 410 + + + YES + + + + + + 411 + + + + + 512 + + + YES + + + + + + + + + + + + + + + + + + + + + + + + + Tables + + + 513 + + + YES + + + + + + 514 + + + YES + + + - 27 - - + 515 + + + YES + + + - 28 - - + 516 + + + YES + + + - 29 - - + 517 + + + YES + + + - 30 - - + 518 + + + YES + + + - 31 - - + 519 + + + YES + + + - 32 - - + 520 + + + YES + + + - 33 - - + 521 + + + YES + + + - 34 - - + 522 + + - 35 - - + 523 + + - 36 - - + 524 + + - 37 - - + 525 + + - 38 - - + 526 + + - 39 - - + 527 + + - 40 - - + 528 + + - 41 - - + 529 + + - 42 - - + 531 + + + YES + + + - 43 - - + 532 + + + YES + + + - 44 - - + 533 + + - 45 - - + 534 + + - 46 - - + 535 + + + YES + + + - 47 - - + 538 + + - 48 - - + 552 + + - 49 - - + 553 + + - 50 - - + 554 + + - 56 - + 567 + YES - - - - - - - - + - - Notifications + - 60 - + 568 + YES - - - - - - - - - + - - AutoUpdate + - 94 - + 569 + YES - + - - - - 95 - - + - 96 - + 570 + YES - + - - - - 97 - - + - 98 - + 571 + YES - - + - 99 - - + 575 + + - 100 - - - YES - - - + 576 + + - 101 - + 577 + YES - + - + - 102 - - + 578 + + - 110 - + 579 + YES - + - + - 111 - - + 580 + + - 117 - - + 581 + + - 254 - - - Favorites + 582 + + - 331 - + 641 + + + YES + + + + + + - Updater + Network - 345 - + 642 + YES - + - - - - 346 - - + - 400 - + 652 + YES - + - - Favorites + - 401 - + 661 + + + + + 669 + + + + + 674 + YES - - + - + - 402 - + 675 + YES - - + - + - 403 - + 676 + YES - - - - - + - + - 406 - + 677 + + + + + 681 + + + + + 784 + + + + + 785 + YES - - - + - + - 407 - - + 786 + + - 408 - - + 787 + + + YES + + + - 409 - + 788 + YES - - + - + - 410 - + 789 + + + + + 790 + YES - + - + - 411 - - + 791 + + - 512 - + 792 + + + + + 802 + YES - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - Tables + Editor - 513 - + 950 + YES - + - 514 - + 951 + + + + + 957 + YES - + - + - 515 - + 958 + + + + + 1034 + YES - + - + - 516 - + 1036 + YES - + - + - 517 - + 1037 + YES - + - + - 518 - + 1039 + YES - + - + - 519 - + 1040 + YES - + - + - 520 - + 1041 + YES - + - + - 521 - + 1042 + YES - + - + - 522 - - + 1043 + + + YES + + + - 523 - - + 1051 + + - 524 - - + 1052 + + - 525 - - + 1053 + + - 526 - - + 1054 + + - 527 - - + 1055 + + - 528 - - + 1057 + + - 529 - - + 1058 + + - 531 - - - YES - - - + 1060 + + - 532 - + 1046 + YES - + - - - - 533 - - + - 534 - - + 1047 + + - 535 - + 1045 + YES - + - - - - 538 - - - - - 552 - - - - - 553 - - - - - 554 - - + - 567 - - - YES - - - + 1048 + + - 568 - + 1044 + YES - + - + - 569 - + 1049 + YES - + - + - 570 - - - YES - - - + 1050 + + - 571 - + 1083 + YES + - - - - 575 - - - - - 576 - - + - 577 - - - YES - - - + 1084 + + - 578 - - + 1085 + + - 579 - + 1128 + YES - + - + - 580 - - + 1129 + + - 581 - - + 1143 + + + YES + + + - 582 - - + 1144 + + - 641 - + 1148 + YES - - - - - + - - Network + - 642 - - - YES - - - + 1149 + + - 652 - + 1150 + YES - + - - - - 661 - - + - 669 - - + 1151 + + - 674 - + 1152 + YES - + - + - 675 - - - YES - - - + 1153 + + - 676 - + 1154 + YES - + - - - - 677 - - + - 681 - - + 1155 + + - 784 - - + 1156 + + - 785 - + 1170 + YES - + + + - - - - 786 - - + - 787 - + 1171 + YES - + - + - 788 - + 1172 + YES - + - - - - 789 - - + - 790 - + 1173 + YES - + + + + + + + + + + + + + + + + + + - + - 791 - - + 1174 + + + YES + + + + + + + + + + + + + + + + + + + + + + - 792 - - + 1175 + + + YES + + + - 802 - + 1176 + YES - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - Editor + - 950 - + 424 + YES - + - + - 951 - - + 469 + + - 957 - + 425 + YES - + - + - 958 - - + 468 + + - 1034 - + 426 + YES - + - + - 1036 - - - YES - - - + 467 + + - 1037 - + 427 + YES - + - + - 1039 - - - YES - - - + 466 + + - 1040 - + 428 + YES - + - + - 1041 - + 465 + + + + + 436 + YES - + - + - 1042 - + 457 + + + + + 437 + YES - + - + - 1043 - + 456 + + + + + 438 + YES - + - - - - 1051 - - + - 1052 - - + 455 + + - 1053 - - + 439 + + + YES + + + - 1054 - - + 454 + + - 1055 - - + 440 + + + YES + + + - 1057 - - + 453 + + - 1058 - - + 429 + + + YES + + + - 1060 - - + 464 + + - 1046 - + 441 + YES - + - + - 1047 - - + 452 + + - 1045 - + 1180 + YES - + - - - - 1048 - - + - 1044 - + 1181 + YES - + - + - 1049 - + 1182 + YES - + + + - + - 1050 - - + 1183 + + - 1083 - + 1184 + + + + + 1185 + + + + + 1186 + YES - + - + - 1084 - - + 1187 + + - 1085 - - + 432 + + + YES + + + + + + 461 + + - 1128 - + 433 + YES - + - + - 1129 - - + 460 + + - 1143 - + 434 + YES - + - + - 1144 - - + 459 + + - 1148 - + 435 + YES - + - + - 1149 - - + 458 + + - 1150 - + 443 + YES - + - + - 1151 - - + 450 + + - 1152 - + 444 + YES - + - + - 1153 - - + 449 + + - 1154 - + 445 + YES - + - - - - 1155 - - + - 1156 - - + 448 + + - 1170 - + 446 + YES - - - + - + - 1171 - + 447 + + + + + 1200 + YES - + - + - 1172 - + 1201 + YES - + - + - 1173 - + 1203 + YES - - - - - - - - + - + - 1174 - + 1207 + YES - - - - - - - - - - + - + - 1175 - + 1208 + YES - + - + - 1176 - + 1209 + YES - - - - - - - - - - - - - - - - - - - - - + - + - 424 - + 1210 + + + + + 1211 + + + + + 1212 + + + + + 1216 + + + + + 1218 + + + + + 1219 + + + + + 1205 + YES - + - + - 469 - - + 1214 + + - 425 - + 1204 + YES - + - + - 468 - - + 1215 + + + + + 1246 + + + YES + + + - 426 - + 1247 + YES - + - + - 467 - - + 1248 + + + YES + + + - 427 - + 1249 + YES - + - + - 466 - - + 1250 + + + YES + + + - 428 - + 1251 + YES - + - + - 465 - - + 1252 + + + YES + + + - 436 - + 1253 + YES - + - + - 457 - - + 1254 + + + YES + + + - 437 - + 1255 + YES - + - + - 456 - - + 1256 + + - 438 - - - YES - - - + 1257 + + - 455 - - + 1258 + + - 439 - - - YES - - - + 1259 + + - 454 - - + 1260 + + - 440 - - - YES - - - + 1261 + + - 453 - - + 1262 + + - 429 - - - YES - - - + 1263 + + - 464 - - + 1264 + + - 441 - + 1265 + + + + + 1351 + YES - + - + - 452 - - + 1352 + + - 1180 - + 1353 + YES - + - + - 1181 - + 1354 + YES - + - + - 1182 - + 1355 + YES - - - + + + - - - - 1183 - - + - 1184 - - + 1356 + + - 1185 - - + 1357 + + - 1186 - - - YES - - - + 1358 + + - 1187 - - + 1385 + + - 432 - + 1418 + YES - + - - - - 461 - - + - 433 - + 1419 + YES - + - + + + + 1420 + + - 460 - - + 1421 + + - 434 - + 1422 + YES - + - - - - 459 - - + - 435 - + 1423 + YES - + + + + + + + + - + - 458 - - + 1449 + + - 443 - - - YES - - - + 1450 + + - 450 - - + 1451 + + - 444 - - - YES - - - + 1452 + + - 449 - - + 1453 + + - 445 - - - YES - - - + 1454 + + - 448 - - + 1455 + + - 446 - + 1465 + YES - + - + - 447 - - + 1466 + + - 1200 - - - YES - - - + 1467 + + - 1201 - + 1468 + YES - + - + - 1203 - - - YES - - - + 1469 + + - 1207 - + 1470 + YES - + - + - 1208 - + 1471 + YES - + - + - 1209 - + 1472 + YES - + + + - + - 1210 - - + 1473 + + - 1211 - - + 1474 + + - 1212 - - + 1475 + + - 1216 - - + 1485 + + + YES + + + - 1218 - - + 1486 + + - 1219 - - + 1487 + + + YES + + + - 1205 - + 1488 + YES - + - + - 1214 - - + 1489 + + - 1204 - - - YES - - - + 1490 + + - 1215 - - + 1492 + + - 1246 - + 1497 + YES - + - + - 1247 - + 1498 + + + + + 1499 + YES - + - + + + + 1500 + + - 1248 - + 1505 + YES - + - + - 1249 - + 1506 + YES - + - + - 1250 - - - YES - - - + 1507 + + - 1251 - + 1517 + YES - + - + - 1252 - + 1518 + YES - + - + - 1253 - + 1519 + YES - + - + - 1254 - + 1520 + YES - + - + - 1255 - + 1521 + YES - + - - - - 1256 - - + - 1257 - - + 1522 + + - 1258 - - + 1523 + + + YES + + + - 1259 - - + 1524 + + - 1260 - - + 1525 + + - 1261 - - + 1526 + + - 1262 - - + 1527 + + - 1263 - - + 1542 + + + YES + + + - 1264 - - + 1543 + + - 1265 - - + 1546 + + - 1351 - + 1547 + YES - + + + + - + + Context Menu - 1352 - - + 1548 + + - 1353 - + 1549 + + + + + 1551 + + + + + 1583 + YES - + + - + - 1354 - + 1584 + YES - + - + - 1355 - + 1586 + YES - - - + - - - - 1356 - - - - - 1357 - - - - - 1358 - - + - 1385 - - + 1587 + + - 1418 - + 1589 + YES - + - + - 1419 - + 1590 + YES - + + + + + - + - 1420 - - + 1591 + + - 1421 - - + 1592 + + - 1422 - + 1594 + + + + + 1597 + + + + + 1598 + YES - + - + - 1423 - + 1599 + YES - - - - - - - - + + + + + - - - - 1449 - - - - - 1450 - - + - 1451 - - + 1600 + + - 1452 - - + 1601 + + - 1453 - - + 1602 + + - 1454 - - + 1603 + + - 1455 - - + 1604 + + - 1465 - + 1615 + YES - + - + - 1466 - - + 1616 + + - 1467 - - + 1618 + + - 1468 - + 1620 + + + + + 1636 + YES - + - + - 1469 - - + 1639 + + - 1470 - + 1640 + + + + + 1669 + YES - + - + - 1471 - + 1670 + YES - + - + - 1472 - + 1671 + YES - - - + + + + + + - + - 1473 - - + 1672 + + - 1474 - - + 1673 + + - 1475 - - + 1674 + + - 1485 - + 1682 + YES - + + + - + - 1486 - - + 1683 + + - 1487 - - - YES - - - + 1684 + + - 1488 - + 1685 + YES - + + - - - - 1489 - - - - - 1490 - - - - - 1492 - - + - 1497 - + 1687 + YES - + - - - - 1498 - - + - 1499 - + 1688 + YES - + - + - 1500 - - + 1689 + + - 1505 - + 1690 + + + + + 1709 + YES - + - + - 1506 - + 1710 + YES - - + - - 1507 - - + + 1712 + + - 1517 - + 1716 + YES - + - + + Enter Name Sheet - 1518 - + 1717 + YES - + + + + + - + - 1519 - + 1718 + YES - + - + - 1520 - + 1721 + YES - + - + - 1521 - + 1722 + YES - + - - - - 1522 - - + - 1523 - + 1723 + YES - + - + - 1524 - - + 1724 + + - 1525 - - + 1725 + + - 1526 - - + 1726 + + - 1527 - - + 1730 + + - 1542 - + 1738 + YES - + - 1543 - - - - - 1546 - - + 1739 + + - 1547 - + 1740 + YES - - - - + - - Context Menu - - - 1548 - - - - - 1549 - - + - 1551 - - + 1741 + + - 1583 - + 1756 + YES - - + - + + Edit Theme List Sheet - 1584 - + 1757 + YES - + + + + - + - 1586 - + 1759 + YES - + - - - - 1587 - - + - 1589 - - - YES - - - + 1764 + + - 1590 - + 1771 + YES - - - - - + + + - - - - 1591 - - - - - 1592 - - + - 1594 - - + 1772 + + - 1597 - - + 1773 + + - 1598 - + 1774 + YES - + - + - 1599 - + 1776 + YES - - - - - + - - - - 1600 - - - - - 1601 - - - - - 1602 - - + - 1603 - - + 1779 + + - - 1604 - - + + 1796 + + - 1615 - + 1809 + YES - + + - - - - 1616 - - + - 1618 - - + 1810 + + + YES + + + - 1620 - - + 1811 + + - 1636 - + 1812 + YES - + - + - 1639 - - + 1813 + + - 1640 - - + 1814 + + - 1669 - + 1824 + YES - + - + - 1670 - - - YES - - - + 1825 + + - 1671 - + 1835 + YES - - - - - - + - + - 1672 - - + 1836 + + - 1673 - - + 1851 + + + YES + + + - 1674 - - + 1852 + + - 1682 - + 1859 + YES - - - + - - - - 1683 - - + - 1684 - - + 1860 + + - 1685 - + 1873 + YES - - + - + + SSH Key Selection Help - 1687 - + 1874 + YES - + - + - 1688 - + 1875 + + + + + 1877 + YES - + - - - - 1689 - - + - 1690 - - + 1878 + + - 1709 - + 1879 + YES - + - + - 1710 - + 1880 + YES + - + - 1712 - - + 1881 + + + YES + + + - 1716 - + 1882 + YES - + - - Enter Name Sheet + - 1717 - + 1883 + YES - - - - - + - + - 1718 - + 1884 + YES - + - + - 1721 - + 1885 + YES - + - + - 1722 - + 1886 + YES - + - + - 1723 - + 1887 + YES - + - + - 1724 - - + 1888 + + - 1725 - - + 1889 + + - 1726 - - + 1890 + + - 1730 - - + 1891 + + - 1738 - - - YES - - - + 1892 + + - 1739 - - + 1893 + + - 1740 - + 1894 + + + + + 1895 + + + + + 1896 + + + + + 2001 + YES - + - - - - 1741 - - + - 1756 - + 2002 + YES - + - - Edit Theme List Sheet + - 1757 - + 2003 + YES - - - - + - + - 1759 - + 2004 + YES - + - + - 1764 - - + 2005 + + + YES + + + - 1771 - + 2006 + YES - - - + - + - 1772 - - + 2007 + + + YES + + + - 1773 - - + 2008 + + + YES + + + - 1774 - + 2009 + YES - + - + - 1776 - + 2010 + YES - + - + - 1779 - - + 2011 + + - 1796 - - + 2012 + + - 1809 - - - YES - - - - + 2013 + + - 1810 - - - YES - - - + 2014 + + - 1811 - - + 2015 + + - 1812 - - - YES - - - + 2016 + + - 1813 - - + 2017 + + - 1814 - - + 2018 + + - 1824 - - - YES - - - + 2019 + + - 1825 - - + 2020 + + - 1835 - + 2040 + YES - + - - - - 1836 - - + + SSL CA Cert File Selection Help - 1851 - + 2041 + YES - + - + + SSL Key File Selection Help - 1852 - - + 2042 + + + YES + + + + SSL Certificate File Selection Help - 1859 - + 2043 + YES - + - + - 1860 - - + 2044 + + - 1873 - + 2045 + YES - + - - SSH Key Selection Help + - 1874 - + 2046 + + + + + 2047 + YES - + - + - 1875 - - + 2048 + + @@ -10677,7 +12771,65 @@ AQAAAAA 1873.IBPluginDependency 1874.IBPluginDependency 1875.IBPluginDependency + 1877.IBPluginDependency + 1878.IBPluginDependency + 1879.IBAttributePlaceholdersKey + 1879.IBPluginDependency + 1880.IBPluginDependency + 1881.IBPluginDependency + 1882.IBAttributePlaceholdersKey + 1882.IBPluginDependency + 1883.IBPluginDependency + 1884.IBPluginDependency + 1885.IBAttributePlaceholdersKey + 1885.IBPluginDependency + 1886.IBPluginDependency + 1887.IBPluginDependency + 1888.IBPluginDependency + 1889.IBPluginDependency + 1890.IBPluginDependency + 1891.IBPluginDependency + 1892.IBPluginDependency + 1893.IBPluginDependency + 1894.IBPluginDependency + 1895.IBPluginDependency + 1896.IBPluginDependency 2.IBPluginDependency + 2001.IBPluginDependency + 2002.IBAttributePlaceholdersKey + 2002.IBPluginDependency + 2003.IBPluginDependency + 2004.IBPluginDependency + 2005.IBAttributePlaceholdersKey + 2005.IBPluginDependency + 2006.IBPluginDependency + 2007.IBPluginDependency + 2008.IBAttributePlaceholdersKey + 2008.IBPluginDependency + 2009.IBPluginDependency + 2010.IBPluginDependency + 2011.IBPluginDependency + 2012.IBPluginDependency + 2013.IBPluginDependency + 2014.IBPluginDependency + 2015.IBPluginDependency + 2016.IBPluginDependency + 2017.IBPluginDependency + 2018.IBPluginDependency + 2019.IBPluginDependency + 2020.IBPluginDependency + 2040.IBEditorWindowLastContentRect + 2040.IBPluginDependency + 2041.IBEditorWindowLastContentRect + 2041.IBPluginDependency + 2042.IBEditorWindowLastContentRect + 2042.IBPluginDependency + 2043.IBPluginDependency + 2044.IBPluginDependency + 2045.IBPluginDependency + 2046.IBPluginDependency + 2047.IBPluginDependency + 2048.IBPluginDependency 24.IBPluginDependency 24.ImportedFromIB2 25.IBPluginDependency @@ -11336,6 +13488,106 @@ AQAAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Click to choose the SSL key file to use when establishing a secure connection + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Click to choose the client SSL certificate file to use when establishing a secure connection + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Click to choose the client SSL Certificate Authority certificate to use when establishing a secure connection + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Click to choose the SSL key file to use when establishing a secure connection + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Click to choose the client SSL certificate file to use when establishing a secure connection + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Click to choose the client SSL Certificate Authority certificate to use when establishing a secure connection + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{245, 466}, {579, 51}} + com.apple.InterfaceBuilder.CocoaPlugin + {{245, 483}, {579, 34}} + com.apple.InterfaceBuilder.CocoaPlugin + {{245, 483}, {579, 34}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -11373,7 +13625,7 @@ AQAAAAA com.apple.InterfaceBuilder.CocoaPlugin - {{320, 375}, {580, 381}} + {{55, 304}, {580, 381}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -11667,7 +13919,7 @@ AQAAAAA - 1876 + 2073 @@ -11799,7 +14051,7 @@ AQAAAAA YES addFavorite: changeFont: - chooseSSHKey: + chooseKeyLocation: closePanelSheet: displayAutoUpdatePreferences: displayEditorPreferences: @@ -11862,7 +14114,7 @@ AQAAAAA YES addFavorite: changeFont: - chooseSSHKey: + chooseKeyLocation: closePanelSheet: displayAutoUpdatePreferences: displayEditorPreferences: @@ -11899,7 +14151,7 @@ AQAAAAA id - chooseSSHKey: + chooseKeyLocation: id @@ -12037,11 +14289,21 @@ AQAAAAA removeThemeButton saveThemeMenuItem socketPasswordField + socketSSLCACertButton + socketSSLCertificateButton + socketSSLKeyFileButton splitViewButtonBar sshKeyLocationHelp sshPasswordField sshSQLPasswordField + sshSSHKeyButton + sslCACertLocationHelp + sslCertificateLocationHelp + sslKeyFileLocationHelp standardPasswordField + standardSSLCACertButton + standardSSLCertificateButton + standardSSLKeyFileButton tableCell tablesView themeNameSaveButton @@ -12082,11 +14344,21 @@ AQAAAAA id NSMenuItem NSSecureTextField + NSButton + NSButton + NSButton BWAnchoredButtonBar NSView NSSecureTextField NSSecureTextField + NSButton + NSView + NSView + NSView NSSecureTextField + NSButton + NSButton + NSButton id NSView id @@ -12130,11 +14402,21 @@ AQAAAAA removeThemeButton saveThemeMenuItem socketPasswordField + socketSSLCACertButton + socketSSLCertificateButton + socketSSLKeyFileButton splitViewButtonBar sshKeyLocationHelp sshPasswordField sshSQLPasswordField + sshSSHKeyButton + sslCACertLocationHelp + sslCertificateLocationHelp + sslKeyFileLocationHelp standardPasswordField + standardSSLCACertButton + standardSSLCertificateButton + standardSSLKeyFileButton tableCell tablesView themeNameSaveButton @@ -12274,6 +14556,18 @@ AQAAAAA socketPasswordField NSSecureTextField + + socketSSLCACertButton + NSButton + + + socketSSLCertificateButton + NSButton + + + socketSSLKeyFileButton + NSButton + splitViewButtonBar BWAnchoredButtonBar @@ -12290,10 +14584,38 @@ AQAAAAA sshSQLPasswordField NSSecureTextField + + sshSSHKeyButton + NSButton + + + sslCACertLocationHelp + NSView + + + sslCertificateLocationHelp + NSView + + + sslKeyFileLocationHelp + NSView + standardPasswordField NSSecureTextField + + standardSSLCACertButton + NSButton + + + standardSSLCertificateButton + NSButton + + + standardSSLKeyFileButton + NSButton + tableCell id diff --git a/Resources/English.lproj/ConnectionView.strings b/Resources/English.lproj/ConnectionView.strings index 95354610..460f15cf 100644 Binary files a/Resources/English.lproj/ConnectionView.strings and b/Resources/English.lproj/ConnectionView.strings differ diff --git a/Resources/English.lproj/DBView.strings b/Resources/English.lproj/DBView.strings index 9310758a..0276e134 100644 Binary files a/Resources/English.lproj/DBView.strings and b/Resources/English.lproj/DBView.strings differ diff --git a/Resources/English.lproj/Localizable.strings b/Resources/English.lproj/Localizable.strings index 273cff5d..29fdc2a8 100644 Binary files a/Resources/English.lproj/Localizable.strings and b/Resources/English.lproj/Localizable.strings differ diff --git a/Resources/English.lproj/Preferences.strings b/Resources/English.lproj/Preferences.strings index 422ecee6..4f1861aa 100644 Binary files a/Resources/English.lproj/Preferences.strings and b/Resources/English.lproj/Preferences.strings differ diff --git a/Resources/English.lproj/UserManagerView.strings b/Resources/English.lproj/UserManagerView.strings index 72deec21..bf8bad55 100644 Binary files a/Resources/English.lproj/UserManagerView.strings and b/Resources/English.lproj/UserManagerView.strings differ diff --git a/Resources/Images/titlebarlock.png b/Resources/Images/titlebarlock.png new file mode 100644 index 00000000..ecdf9d00 Binary files /dev/null and b/Resources/Images/titlebarlock.png differ diff --git a/Scripts/build-mysql-client.sh b/Scripts/build-mysql-client.sh index 3870162c..1641053c 100755 --- a/Scripts/build-mysql-client.sh +++ b/Scripts/build-mysql-client.sh @@ -17,10 +17,10 @@ DEBUG='NO' CLEAN='NO' # C/C++ compiler flags -export CFLAGS='-isysroot /Developer/SDKs/MacOSX10.5.sdk -arch ppc -arch i386 -arch x86_64 -O3 -fno-omit-frame-pointer -mmacosx-version-min=10.5' +export CFLAGS='-isysroot /Developer/SDKs/MacOSX10.5.sdk -arch ppc -arch i386 -arch x86_64 -O3 -fno-omit-frame-pointer -fno-exceptions -mmacosx-version-min=10.5' export CXXFLAGS='-isysroot /Developer/SDKs/MacOSX10.5.sdk -arch ppc -arch i386 -arch x86_64 -O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti -mmacosx-version-min=10.5' -CONFIGURE_OPTIONS='--without-server --enable-thread-safe-client --disable-dependency-tracking --enable-local-infile' +CONFIGURE_OPTIONS='--without-server --enable-thread-safe-client --disable-dependency-tracking --enable-local-infile --with-ssl --enable-assembler --with-mysqld-ldflags=-all-static' BINARY_DISTRIBUTION_SCRIPT='scripts/make_binary_distribution' usage() diff --git a/Source/SPConnectionController.h b/Source/SPConnectionController.h index 3aac3054..73622f40 100644 --- a/Source/SPConnectionController.h +++ b/Source/SPConnectionController.h @@ -77,6 +77,13 @@ NSString *database; NSString *socket; NSString *port; + int useSSL; + int sslKeyFileLocationEnabled; + NSString *sslKeyFileLocation; + int sslCertificateFileLocationEnabled; + NSString *sslCertificateFileLocation; + int sslCACertFileLocationEnabled; + NSString *sslCACertFileLocation; NSString *sshHost; NSString *sshUser; NSString *sshPassword; @@ -103,9 +110,14 @@ IBOutlet NSView *connectionResizeContainer; IBOutlet NSView *standardConnectionFormContainer; + IBOutlet NSView *standardConnectionSSLDetailsContainer; IBOutlet NSView *socketConnectionFormContainer; + IBOutlet NSView *socketConnectionSSLDetailsContainer; IBOutlet NSView *sshConnectionFormContainer; IBOutlet NSView *sshKeyLocationHelp; + IBOutlet NSView *sslKeyFileLocationHelp; + IBOutlet NSView *sslCertificateLocationHelp; + IBOutlet NSView *sslCACertLocationHelp; IBOutlet NSTextField *standardSQLHostField; IBOutlet NSTextField *sshSQLHostField; @@ -114,6 +126,12 @@ IBOutlet NSSecureTextField *sshPasswordField; IBOutlet NSSecureTextField *sshSSHPasswordField; IBOutlet NSButton *sshSSHKeyButton; + IBOutlet NSButton *standardSSLKeyFileButton; + IBOutlet NSButton *standardSSLCertificateButton; + IBOutlet NSButton *standardSSLCACertButton; + IBOutlet NSButton *socketSSLKeyFileButton; + IBOutlet NSButton *socketSSLCertificateButton; + IBOutlet NSButton *socketSSLCACertButton; IBOutlet NSButton *addToFavoritesButton; IBOutlet NSButton *connectButton; @@ -137,6 +155,13 @@ @property (readwrite, retain) NSString *database; @property (readwrite, retain) NSString *socket; @property (readwrite, retain) NSString *port; +@property (readwrite, assign) int useSSL; +@property (readwrite, assign) int sslKeyFileLocationEnabled; +@property (readwrite, retain) NSString *sslKeyFileLocation; +@property (readwrite, assign) int sslCertificateFileLocationEnabled; +@property (readwrite, retain) NSString *sslCertificateFileLocation; +@property (readwrite, assign) int sslCACertFileLocationEnabled; +@property (readwrite, retain) NSString *sslCACertFileLocation; @property (readwrite, retain) NSString *sshHost; @property (readwrite, retain) NSString *sshUser; @property (readwrite, retain) NSString *sshPassword; @@ -165,9 +190,10 @@ - (void)addConnectionToDocument; // Interface interaction -- (IBAction)chooseSSHKey:(id)sender; +- (IBAction)chooseKeyLocation:(id)sender; - (IBAction)editFavorites:(id)sender; - (IBAction)showHelp:(id)sender; +- (IBAction)updateSSLInterface:(id)sender; - (void)resizeTabViewToConnectionType:(NSUInteger)theType animating:(BOOL)animate; - (IBAction)sortFavorites:(id)sender; - (IBAction)reverseSortFavorites:(id)sender; diff --git a/Source/SPConnectionController.m b/Source/SPConnectionController.m index 258a0b0f..aefca1fd 100644 --- a/Source/SPConnectionController.m +++ b/Source/SPConnectionController.m @@ -51,6 +51,13 @@ @synthesize database; @synthesize socket; @synthesize port; +@synthesize useSSL; +@synthesize sslKeyFileLocationEnabled; +@synthesize sslKeyFileLocation; +@synthesize sslCertificateFileLocationEnabled; +@synthesize sslCertificateFileLocation; +@synthesize sslCACertFileLocationEnabled; +@synthesize sslCACertFileLocation; @synthesize sshHost; @synthesize sshUser; @synthesize sshPassword; @@ -130,8 +137,8 @@ if (tableRow < [favorites count]) { previousType = [[[favorites objectAtIndex:tableRow] objectForKey:@"type"] integerValue]; - [self resizeTabViewToConnectionType:[[[favorites objectAtIndex:tableRow] objectForKey:@"type"] integerValue] animating:NO]; [favoritesTable selectRowIndexes:[NSIndexSet indexSetWithIndex:tableRow] byExtendingSelection:NO]; + [self resizeTabViewToConnectionType:[[[favorites objectAtIndex:tableRow] objectForKey:@"type"] integerValue] animating:NO]; [favoritesTable scrollRowToVisible:[favoritesTable selectedRow]]; } else { previousType = SPTCPIPConnection; @@ -196,7 +203,35 @@ // Ensure that a socket connection is not inadvertently used if (![self checkHost]) return; - + + // If SSL keys have been supplied, verify they exist + if (([self type] == SPTCPIPConnection || [self type] == SPSocketConnection) && [self useSSL]) { + if (sslKeyFileLocationEnabled && sslKeyFileLocation + && ![[NSFileManager defaultManager] fileExistsAtPath:[sslKeyFileLocation stringByExpandingTildeInPath]]) + { + [self setSslKeyFileLocationEnabled:NSOffState]; + [self setSslKeyFileLocation:nil]; + SPBeginAlertSheet(NSLocalizedString(@"SSL Key File not found", @"SSL key file check error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocument parentWindow], self, nil, nil, NSLocalizedString(@"A SSL key file location was specified, but no file was found in the specified location. Please re-select the key file and try again.", @"SSL key file not found message")); + return; + } + if (sslCertificateFileLocationEnabled && sslCertificateFileLocation + && ![[NSFileManager defaultManager] fileExistsAtPath:[sslCertificateFileLocation stringByExpandingTildeInPath]]) + { + [self setSslCertificateFileLocationEnabled:NSOffState]; + [self setSslCertificateFileLocation:nil]; + SPBeginAlertSheet(NSLocalizedString(@"SSL Certificate File not found", @"SSL certificate file check error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocument parentWindow], self, nil, nil, NSLocalizedString(@"A SSL certificate location was specified, but no file was found in the specified location. Please re-select the certificate and try again.", @"SSL certificate file not found message")); + return; + } + if (sslCACertFileLocationEnabled && sslCACertFileLocation + && ![[NSFileManager defaultManager] fileExistsAtPath:[sslCACertFileLocation stringByExpandingTildeInPath]]) + { + [self setSslCACertFileLocationEnabled:NSOffState]; + [self setSslCACertFileLocation:nil]; + SPBeginAlertSheet(NSLocalizedString(@"SSL Certificate Authority File not found", @"SSL certificate authority file check error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocument parentWindow], self, nil, nil, NSLocalizedString(@"A SSL Certificate Authority certificate location was specified, but no file was found in the specified location. Please re-select the Certificate Authority certificate and try again.", @"SSL CA certificate file not found message")); + return; + } + } + // Basic details have validated - start the connection process animating isConnecting = YES; cancellingConnection = NO; @@ -479,47 +514,114 @@ #pragma mark Interface interaction /** - * Opens the SSH key selection window, ready to select a SSH key. + * Opens the SSH/SSL key selection window, ready to select a key file. */ -- (IBAction)chooseSSHKey:(id)sender +- (IBAction)chooseKeyLocation:(id)sender { [favoritesTable deselectAll:self]; NSString *directoryPath = nil; NSString *filePath = nil; + NSArray *permittedFileTypes = nil; + NSOpenPanel *openPanel = [NSOpenPanel openPanel]; - // If the custom key location is currently disabled - after the button - // action - leave it disabled and return without showing the sheet. - if (!sshKeyLocationEnabled) { - return; - } + // Switch details by sender. + // First, SSH keys: + if (sender == sshSSHKeyButton) { + + // If the custom key location is currently disabled - after the button + // action - leave it disabled and return without showing the sheet. + if (!sshKeyLocationEnabled) { + return; + } + + // Otherwise open a panel at the last or default location + if (sshKeyLocation && [sshKeyLocation length]) { + filePath = [sshKeyLocation lastPathComponent]; + directoryPath = [sshKeyLocation stringByDeletingLastPathComponent]; + } + + permittedFileTypes = [NSArray arrayWithObjects:@"pem", @"", nil]; + [openPanel setAccessoryView:sshKeyLocationHelp]; - // Otherwise open a panel at the last or default location - if (sshKeyLocation && [sshKeyLocation length]) { - filePath = [sshKeyLocation lastPathComponent]; - directoryPath = [sshKeyLocation stringByDeletingLastPathComponent]; + // SSL key file location: + } else if (sender == standardSSLKeyFileButton || sender == socketSSLKeyFileButton) { + if ([sender state] == NSOffState) { + [self setSslKeyFileLocation:nil]; + return; + } + permittedFileTypes = [NSArray arrayWithObjects:@"pem", @"key", @"", nil]; + [openPanel setAccessoryView:sslKeyFileLocationHelp]; + + // SSL certificate file location: + } else if (sender == standardSSLCertificateButton || sender == socketSSLCertificateButton) { + if ([sender state] == NSOffState) { + [self setSslCertificateFileLocation:nil]; + return; + } + permittedFileTypes = [NSArray arrayWithObjects:@"pem", @"cert", @"", nil]; + [openPanel setAccessoryView:sslCertificateLocationHelp]; + + // SSL CA certificate file location: + } else if (sender == standardSSLCACertButton || sender == socketSSLCACertButton) { + if ([sender state] == NSOffState) { + [self setSslCACertFileLocation:nil]; + return; + } + permittedFileTypes = [NSArray arrayWithObjects:@"pem", @"cert", @"", nil]; + [openPanel setAccessoryView:sslCACertLocationHelp]; } - NSOpenPanel *openPanel = [NSOpenPanel openPanel]; - [openPanel setAccessoryView:sshKeyLocationHelp]; [openPanel beginSheetForDirectory:directoryPath file:filePath - types:[NSArray arrayWithObjects:@"pem", @"", nil] + types:permittedFileTypes modalForWindow:[tableDocument parentWindow] modalDelegate:self - didEndSelector:@selector(chooseSSHKeySheetDidEnd:returnCode:contextInfo:) - contextInfo:nil]; + didEndSelector:@selector(chooseKeyLocationSheetDidEnd:returnCode:contextInfo:) + contextInfo:sender]; } /** - * Called after closing the SSH key selection sheet. + * Called after closing the SSH/SSL key selection sheet. */ -- (void)chooseSSHKeySheetDidEnd:(NSOpenPanel *)openPanel returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo +- (void)chooseKeyLocationSheetDidEnd:(NSOpenPanel *)openPanel returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { - if (returnCode == NSCancelButton) { - [self setSshKeyLocationEnabled:NSOffState]; - return; + NSString *abbreviatedFileName = [[openPanel filename] stringByAbbreviatingWithTildeInPath]; + + // SSH key file selection + if (contextInfo == sshSSHKeyButton) { + if (returnCode == NSCancelButton) { + [self setSshKeyLocationEnabled:NSOffState]; + return; + } + [self setSshKeyLocation:abbreviatedFileName]; + + // SSL key file selection + } else if (contextInfo == standardSSLKeyFileButton || contextInfo == socketSSLKeyFileButton) { + if (returnCode == NSCancelButton) { + [self setSslKeyFileLocationEnabled:NSOffState]; + [self setSslKeyFileLocation:nil]; + return; + } + [self setSslKeyFileLocation:abbreviatedFileName]; + + // SSL certificate file selection + } else if (contextInfo == standardSSLCertificateButton || contextInfo == socketSSLCertificateButton) { + if (returnCode == NSCancelButton) { + [self setSslCertificateFileLocationEnabled:NSOffState]; + [self setSslCertificateFileLocation:nil]; + return; + } + [self setSslCertificateFileLocation:abbreviatedFileName]; + + // SSL CA certificate file selection + } else if (contextInfo == standardSSLCACertButton || contextInfo == socketSSLCACertButton) { + if (returnCode == NSCancelButton) { + [self setSslCACertFileLocationEnabled:NSOffState]; + [self setSslCACertFileLocation:nil]; + return; + } + [self setSslCACertFileLocation:abbreviatedFileName]; } - [self setSshKeyLocation:[[openPanel filename] stringByAbbreviatingWithTildeInPath]]; } /** @@ -544,6 +646,14 @@ [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:SPLOCALIZEDURL_CONNECTIONHELP]]; } +/** + * Resize parts of the interface to reflect SSL status. + */ +- (IBAction)updateSSLInterface:(id)sender +{ + [self resizeTabViewToConnectionType:[self type] animating:YES]; +} + #pragma mark - #pragma mark Connection details interaction and display @@ -638,9 +748,11 @@ switch (theType) { case SPTCPIPConnection: targetResizeRect = [standardConnectionFormContainer frame]; + if ([self useSSL]) additionalFormHeight += [standardConnectionSSLDetailsContainer frame].size.height; break; case SPSocketConnection: targetResizeRect = [socketConnectionFormContainer frame]; + if ([self useSSL]) additionalFormHeight += [socketConnectionSSLDetailsContainer frame].size.height; break; case SPSSHTunnelConnection: targetResizeRect = [sshConnectionFormContainer frame]; @@ -761,18 +873,29 @@ if (connectionSSHKeychainItemAccount) [connectionSSHKeychainItemAccount release], connectionSSHKeychainItemAccount = nil; // Update key-value properties from the selected favourite, using empty strings where not found - [self setType:([self valueForKeyPath:@"selectedFavorite.type"] ? [[self valueForKeyPath:@"selectedFavorite.type"] integerValue] : SPTCPIPConnection)]; - [self setName:([self valueForKeyPath:@"selectedFavorite.name"] ? [self valueForKeyPath:@"selectedFavorite.name"] : @"")]; - [self setHost:([self valueForKeyPath:@"selectedFavorite.host"] ? [self valueForKeyPath:@"selectedFavorite.host"] : @"")]; - [self setSocket:([self valueForKeyPath:@"selectedFavorite.socket"] ? [self valueForKeyPath:@"selectedFavorite.socket"] : @"")]; - [self setUser:([self valueForKeyPath:@"selectedFavorite.user"] ? [self valueForKeyPath:@"selectedFavorite.user"] : @"")]; - [self setPort:([self valueForKeyPath:@"selectedFavorite.port"] ? [self valueForKeyPath:@"selectedFavorite.port"] : @"")]; - [self setDatabase:([self valueForKeyPath:@"selectedFavorite.database"] ? [self valueForKeyPath:@"selectedFavorite.database"] : @"")]; - [self setSshHost:([self valueForKeyPath:@"selectedFavorite.sshHost"] ? [self valueForKeyPath:@"selectedFavorite.sshHost"] : @"")]; - [self setSshUser:([self valueForKeyPath:@"selectedFavorite.sshUser"] ? [self valueForKeyPath:@"selectedFavorite.sshUser"] : @"")]; - [self setSshKeyLocationEnabled:([self valueForKeyPath:@"selectedFavorite.sshKeyLocationEnabled"] ? [[self valueForKeyPath:@"selectedFavorite.sshKeyLocationEnabled"] intValue] : NSOffState)]; - [self setSshKeyLocation:([self valueForKeyPath:@"selectedFavorite.sshKeyLocation"] ? [self valueForKeyPath:@"selectedFavorite.sshKeyLocation"] : @"")]; - [self setSshPort:([self valueForKeyPath:@"selectedFavorite.sshPort"] ? [self valueForKeyPath:@"selectedFavorite.sshPort"] : @"")]; + NSDictionary *fav = [self selectedFavorite]; + [self setType:([fav objectForKey:@"type"] ? [[fav objectForKey:@"type"] integerValue] : SPTCPIPConnection)]; + [self setName:([fav objectForKey:@"name"] ? [fav objectForKey:@"name"] : @"")]; + [self setHost:([fav objectForKey:@"host"] ? [fav objectForKey:@"host"] : @"")]; + [self setSocket:([fav objectForKey:@"socket"] ? [fav objectForKey:@"socket"] : @"")]; + [self setUser:([fav objectForKey:@"user"] ? [fav objectForKey:@"user"] : @"")]; + [self setPort:([fav objectForKey:@"port"] ? [fav objectForKey:@"port"] : @"")]; + [self setUseSSL:([fav objectForKey:@"useSSL"] ? [[fav objectForKey:@"useSSL"] intValue] : NSOffState)]; + [self setSslKeyFileLocationEnabled:([fav objectForKey:@"sslKeyFileLocationEnabled"] ? [[fav objectForKey:@"sslKeyFileLocationEnabled"] intValue] : NSOffState)]; + [self setSslKeyFileLocation:([fav objectForKey:@"sslKeyFileLocation"] ? [fav objectForKey:@"sslKeyFileLocation"] : @"")]; + [self setSslCertificateFileLocationEnabled:([fav objectForKey:@"sslCertificateFileLocationEnabled"] ? [[fav objectForKey:@"sslCertificateFileLocationEnabled"] intValue] : NSOffState)]; + [self setSslCertificateFileLocation:([fav objectForKey:@"sslCertificateFileLocation"] ? [fav objectForKey:@"sslCertificateFileLocation"] : @"")]; + [self setSslCACertFileLocationEnabled:([fav objectForKey:@"sslCACertFileLocationEnabled"] ? [[fav objectForKey:@"sslCACertFileLocationEnabled"] intValue] : NSOffState)]; + [self setSslCACertFileLocation:([fav objectForKey:@"sslCACertFileLocation"] ? [fav objectForKey:@"sslCACertFileLocation"] : @"")]; + [self setDatabase:([fav objectForKey:@"database"] ? [fav objectForKey:@"database"] : @"")]; + [self setSshHost:([fav objectForKey:@"sshHost"] ? [fav objectForKey:@"sshHost"] : @"")]; + [self setSshUser:([fav objectForKey:@"sshUser"] ? [fav objectForKey:@"sshUser"] : @"")]; + [self setSshKeyLocationEnabled:([fav objectForKey:@"sshKeyLocationEnabled"] ? [[fav objectForKey:@"sshKeyLocationEnabled"] intValue] : NSOffState)]; + [self setSshKeyLocation:([fav objectForKey:@"sshKeyLocation"] ? [fav objectForKey:@"sshKeyLocation"] : @"")]; + [self setSshPort:([fav objectForKey:@"sshPort"] ? [fav objectForKey:@"sshPort"] : @"")]; + + // Trigger an interface update + [self resizeTabViewToConnectionType:[self type] animating:YES]; // Check whether the password exists in the keychain, and if so add it; also record the // keychain details so we can pass around only those details if the password doesn't change @@ -863,6 +986,13 @@ if ([self socket]) [newFavorite setObject:[self socket] forKey:@"socket"]; if ([self user]) [newFavorite setObject:[self user] forKey:@"user"]; if ([self port]) [newFavorite setObject:[self port] forKey:@"port"]; + if ([self useSSL]) [newFavorite setObject:[NSNumber numberWithInt:[self useSSL]] forKey:@"useSSL"]; + [newFavorite setObject:[NSNumber numberWithInt:[self sslKeyFileLocationEnabled]] forKey:@"sslKeyFileLocationEnabled"]; + if ([self sslKeyFileLocation]) [newFavorite setObject:[self sslKeyFileLocation] forKey:@"sslKeyFileLocation"]; + [newFavorite setObject:[NSNumber numberWithInt:[self sslCertificateFileLocationEnabled]] forKey:@"sslCertificateFileLocationEnabled"]; + if ([self sslCertificateFileLocation]) [newFavorite setObject:[self sslCertificateFileLocation] forKey:@"sslCertificateFileLocation"]; + [newFavorite setObject:[NSNumber numberWithInt:[self sslCACertFileLocationEnabled]] forKey:@"sslCACertFileLocationEnabled"]; + if ([self sslCACertFileLocation]) [newFavorite setObject:[self sslCACertFileLocation] forKey:@"sslCACertFileLocation"]; if ([self database]) [newFavorite setObject:[self database] forKey:@"database"]; if ([self sshHost]) [newFavorite setObject:[self sshHost] forKey:@"sshHost"]; if ([self sshUser]) [newFavorite setObject:[self sshUser] forKey:@"sshUser"]; @@ -1248,7 +1378,16 @@ [progressIndicator stopAnimation:self]; [progressIndicatorText setHidden:YES]; [addToFavoritesButton setHidden:NO]; - + + // If SSL was enabled, check it was established correctly + if (useSSL && ([self type] == SPTCPIPConnection || [self type] == SPSocketConnection)) { + if (![mySQLConnection isConnectedViaSSL]) { + SPBeginAlertSheet(NSLocalizedString(@"SSL connection not established", @"SSL requested but not used title"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocument parentWindow], nil, nil, nil, NSLocalizedString(@"You requested that the connection should be established using SSL, but MySQL made the connection without SSL.\n\nThis may be because the server does not support SSL connections, or has SSL disabled; or insufficient details were supplied to establish an SSL connection.\n\nThis connection is not encrypted.", @"SSL connection requested but not established error detail")); + } else { + [tableDocument setStatusIconToImageWithName:@"titlebarlock"]; + } + } + // Re-enable favorites table view [favoritesTable setEnabled:YES]; [favoritesTable display]; @@ -1289,10 +1428,19 @@ if (!connectionKeychainItemName && [self password]) { [mySQLConnection setPassword:[self password]]; } + + // Enable SSL if set + if ([self useSSL]) { + [mySQLConnection setSSL:YES + usingKeyFilePath:[self sslKeyFileLocationEnabled] ? [self sslKeyFileLocation] : nil + certificatePath:[self sslCertificateFileLocationEnabled] ? [self sslCertificateFileLocation] : nil + certificateAuthorityCertificatePath:[self sslCACertFileLocationEnabled] ? [self sslCACertFileLocation] : nil]; + } + // Connection delegate must be set before actual connection attempt is made [mySQLConnection setDelegate:tableDocument]; - + // Set whether or not we should enable delegate logging according to the prefs [mySQLConnection setDelegateQueryLogging:[prefs boolForKey:SPConsoleEnableLogging]]; diff --git a/Source/SPDatabaseDocument.m b/Source/SPDatabaseDocument.m index 648a7691..1a0ae6d6 100644 --- a/Source/SPDatabaseDocument.m +++ b/Source/SPDatabaseDocument.m @@ -267,10 +267,17 @@ [connectionController setHost:@""]; [connectionController setPort:@""]; [connectionController setSocket:@""]; + [connectionController setUseSSL:NSOffState]; + [connectionController setSslKeyFileLocationEnabled:NSOffState]; + [connectionController setSslKeyFileLocation:nil]; + [connectionController setSslCertificateFileLocationEnabled:NSOffState]; + [connectionController setSslCertificateFileLocation:nil]; + [connectionController setSslCACertFileLocationEnabled:NSOffState]; + [connectionController setSslCACertFileLocation:nil]; [connectionController setSshHost:@""]; [connectionController setSshUser:@""]; [connectionController setSshKeyLocationEnabled:NSOffState]; - [connectionController setSshKeyLocation:@""]; + [connectionController setSshKeyLocation:nil]; [connectionController setSshPort:@""]; [connectionController setDatabase:@""]; [connectionController setPassword:nil]; @@ -468,6 +475,22 @@ [connectionController setHost:[connection objectForKey:@"host"]]; if([connection objectForKey:@"port"]) [connectionController setPort:[NSString stringWithFormat:@"%ld", (long)[[connection objectForKey:@"port"] integerValue]]]; + + if([connection objectForKey:@"useSSL"]) + [connectionController setUseSSL:[[connection objectForKey:@"useSSL"] intValue]]; + if([connection objectForKey:@"sslKeyFileLocationEnabled"]) + [connectionController setSslKeyFileLocationEnabled:[[connection objectForKey:@"sslKeyFileLocationEnabled"] intValue]]; + if([connection objectForKey:@"sslKeyFileLocation"]) + [connectionController setSslKeyFileLocation:[connection objectForKey:@"sslKeyFileLocation"]]; + if([connection objectForKey:@"sslCertificateFileLocationEnabled"]) + [connectionController setSslCertificateFileLocationEnabled:[[connection objectForKey:@"sslCertificateFileLocationEnabled"] intValue]]; + if([connection objectForKey:@"sslCertificateFileLocation"]) + [connectionController setSslCertificateFileLocation:[connection objectForKey:@"sslCertificateFileLocation"]]; + if([connection objectForKey:@"sslCACertFileLocationEnabled"]) + [connectionController setSslCACertFileLocationEnabled:[[connection objectForKey:@"sslCACertFileLocationEnabled"] intValue]]; + if([connection objectForKey:@"sslCACertFileLocation"]) + [connectionController setSslCACertFileLocation:[connection objectForKey:@"sslCACertFileLocation"]]; + if([connection objectForKey:@"kcid"] && [(NSString *)[connection objectForKey:@"kcid"] length]) [self setKeychainID:[connection objectForKey:@"kcid"]]; @@ -530,6 +553,8 @@ [spfDocData setObject:[NSNumber numberWithBool:NO] forKey:@"auto_connect"]; + [connectionController updateSSLInterface:self]; + if([spf objectForKey:@"auto_connect"] && [[spf valueForKey:@"auto_connect"] boolValue]) { [spfDocData setObject:[NSNumber numberWithBool:YES] forKey:@"auto_connect"]; [connectionController initiateConnection:self]; @@ -3292,6 +3317,14 @@ [connection setObject:[self host] forKey:@"host"]; [connection setObject:[self user] forKey:@"user"]; + [connection setObject:[NSNumber numberWithInt:[connectionController useSSL]] forKey:@"useSSL"]; + [connection setObject:[NSNumber numberWithInt:[connectionController sslKeyFileLocationEnabled]] forKey:@"sslKeyFileLocationEnabled"]; + [connection setObject:[connectionController sslKeyFileLocation] forKey:@"sslKeyFileLocation"]; + [connection setObject:[NSNumber numberWithInt:[connectionController sslCertificateFileLocationEnabled]] forKey:@"sslCertificateFileLocationEnabled"]; + [connection setObject:[connectionController sslCertificateFileLocation] forKey:@"sslCertificateFileLocation"]; + [connection setObject:[NSNumber numberWithInt:[connectionController sslCACertFileLocationEnabled]] forKey:@"sslCACertFileLocationEnabled"]; + [connection setObject:[connectionController sslCACertFileLocation] forKey:@"sslCACertFileLocation"]; + switch([connectionController type]) { case SPTCPIPConnection: aString = @"SPTCPIPConnection"; diff --git a/Source/SPPreferenceController.h b/Source/SPPreferenceController.h index 7d8e0375..9f85ecc1 100644 --- a/Source/SPPreferenceController.h +++ b/Source/SPPreferenceController.h @@ -57,8 +57,18 @@ IBOutlet NSTextField *favoriteUserTextFieldSocket; IBOutlet NSTextField *favoriteUserTextFieldSSH; IBOutlet NSTextField *favoriteHostTextFieldSSH; + IBOutlet NSButton *sshSSHKeyButton; + IBOutlet NSButton *standardSSLKeyFileButton; + IBOutlet NSButton *standardSSLCertificateButton; + IBOutlet NSButton *standardSSLCACertButton; + IBOutlet NSButton *socketSSLKeyFileButton; + IBOutlet NSButton *socketSSLCertificateButton; + IBOutlet NSButton *socketSSLCACertButton; IBOutlet NSMenuItem *favoritesSortByMenuItem; IBOutlet NSView *sshKeyLocationHelp; + IBOutlet NSView *sslKeyFileLocationHelp; + IBOutlet NSView *sslCertificateLocationHelp; + IBOutlet NSView *sslCACertLocationHelp; IBOutlet NSWindow *enterNameWindow; IBOutlet NSTextField *enterNameLabel; @@ -133,7 +143,7 @@ - (IBAction)closePanelSheet:(id)sender; - (IBAction)duplicateTheme:(id)sender; - (IBAction)removeTheme:(id)sender; -- (IBAction)chooseSSHKey:(id)sender; +- (IBAction)chooseKeyLocation:(id)sender; // Toolbar item IBAction methods - (IBAction)displayGeneralPreferences:(id)sender; diff --git a/Source/SPPreferenceController.m b/Source/SPPreferenceController.m index c1f3877a..d05868b9 100644 --- a/Source/SPPreferenceController.m +++ b/Source/SPPreferenceController.m @@ -409,8 +409,8 @@ NSNumber *favoriteid = [NSNumber numberWithInteger:[[NSString stringWithFormat:@"%f", [[NSDate date] timeIntervalSince1970]] hash]]; // Create default favorite - NSMutableDictionary *favorite = [NSMutableDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"New Favorite", [NSNumber numberWithInteger:0], @"", @"", @"", @"", @"", @"", @"", [NSNumber numberWithInt:NSOffState], @"", @"", favoriteid, nil] - forKeys:[NSArray arrayWithObjects:@"name", @"type", @"host", @"socket", @"user", @"port", @"database", @"sshHost", @"sshUser", @"sshKeyLocationEnabled", @"sshKeyLocation", @"sshPort", @"id", nil]]; + NSMutableDictionary *favorite = [NSMutableDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"New Favorite", [NSNumber numberWithInteger:0], @"", @"", @"", @"", [NSNumber numberWithInt:NSOffState], [NSNumber numberWithInt:NSOffState], [NSNumber numberWithInt:NSOffState], [NSNumber numberWithInt:NSOffState], @"", @"", @"", [NSNumber numberWithInt:NSOffState], @"", @"", favoriteid, nil] + forKeys:[NSArray arrayWithObjects:@"name", @"type", @"host", @"socket", @"user", @"port", @"useSSL", @"sslKeyFileLocationEnabled", @"sslCertificateFileLocationEnabled", @"sslCACertFileLocationEnabled", @"database", @"sshHost", @"sshUser", @"sshKeyLocationEnabled", @"sshKeyLocation", @"sshPort", @"id", nil]]; [favoritesController addObject:favorite]; [favoritesController setSelectedObjects:[NSArray arrayWithObject:favorite]]; @@ -686,47 +686,115 @@ } /** - * Opens the SSH key selection window, ready to select a SSH key. + * Opens the SSH/SSL key selection window, ready to select a key file. */ -- (IBAction)chooseSSHKey:(id)sender + - (IBAction)chooseKeyLocation:(id)sender { NSString *directoryPath = nil; NSString *filePath = nil; + NSArray *permittedFileTypes = nil; + NSOpenPanel *openPanel = [NSOpenPanel openPanel]; - // If the custom key location is currently disabled - after the button - // action - leave it disabled and return without showing the sheet. - if (![[favoritesController valueForKeyPath:@"selection.sshKeyLocationEnabled"] intValue]) { - return; - } + // Switch details by sender. + // First, SSH keys: + if (sender == sshSSHKeyButton) { - // Otherwise open a panel at the last or default location - if ([favoritesController valueForKeyPath:@"selection.sshKeyLocation"] && [[favoritesController valueForKeyPath:@"selection.sshKeyLocation"] length]) { - filePath = [[favoritesController valueForKeyPath:@"selection.sshKeyLocation"] lastPathComponent]; - directoryPath = [[favoritesController valueForKeyPath:@"selection.sshKeyLocation"] stringByDeletingLastPathComponent]; - } + // If the custom key location is currently disabled - after the button + // action - leave it disabled and return without showing the sheet. + if (![favoritesController valueForKeyPath:@"selection.sshKeyLocationEnabled"]) { + return; + } + // Otherwise open a panel at the last or default location + NSString *sshKeyLocation = [favoritesController valueForKeyPath:@"selection.sshKeyLocation"]; + if (sshKeyLocation && [sshKeyLocation length]) { + filePath = [sshKeyLocation lastPathComponent]; + directoryPath = [sshKeyLocation stringByDeletingLastPathComponent]; + } + + permittedFileTypes = [NSArray arrayWithObjects:@"pem", @"", nil]; + [openPanel setAccessoryView:sshKeyLocationHelp]; + + // SSL key file location: + } else if (sender == standardSSLKeyFileButton || sender == socketSSLKeyFileButton) { + if ([sender state] == NSOffState) { + [favoritesController setValue:nil forKeyPath:@"selection.sslKeyFileLocation"]; + return; + } + permittedFileTypes = [NSArray arrayWithObjects:@"pem", @"key", @"", nil]; + [openPanel setAccessoryView:sslKeyFileLocationHelp]; + + // SSL certificate file location: + } else if (sender == standardSSLCertificateButton || sender == socketSSLCertificateButton) { + if ([sender state] == NSOffState) { + [favoritesController setValue:nil forKeyPath:@"selection.sslCertificateFileLocation"]; + return; + } + permittedFileTypes = [NSArray arrayWithObjects:@"pem", @"cert", @"", nil]; + [openPanel setAccessoryView:sslCertificateLocationHelp]; + + // SSL CA certificate file location: + } else if (sender == standardSSLCACertButton || sender == socketSSLCACertButton) { + if ([sender state] == NSOffState) { + [favoritesController setValue:nil forKeyPath:@"selection.sslCACertFileLocation"]; + return; + } + permittedFileTypes = [NSArray arrayWithObjects:@"pem", @"cert", @"", nil]; + [openPanel setAccessoryView:sslCACertLocationHelp]; + } - NSOpenPanel *openPanel = [NSOpenPanel openPanel]; - [openPanel setAccessoryView:sshKeyLocationHelp]; [openPanel beginSheetForDirectory:directoryPath file:filePath - types:[NSArray arrayWithObjects:@"pem", @"", nil] + types:permittedFileTypes modalForWindow:preferencesWindow modalDelegate:self - didEndSelector:@selector(chooseSSHKeySheetDidEnd:returnCode:contextInfo:) - contextInfo:nil]; + didEndSelector:@selector(chooseKeyLocationSheetDidEnd:returnCode:contextInfo:) + contextInfo:sender]; } /** - * Called after closing the SSH key selection sheet. + * Called after closing the SSH/SSL key selection sheet. */ -- (void)chooseSSHKeySheetDidEnd:(NSOpenPanel *)openPanel returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo +- (void)chooseKeyLocationSheetDidEnd:(NSOpenPanel *)openPanel returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { - if (returnCode == NSCancelButton) { - [favoritesController setValue:[NSNumber numberWithInt:NSOffState] forKeyPath:@"selection.sshKeyLocationEnabled"]; - return; + NSString *abbreviatedFileName = [[openPanel filename] stringByAbbreviatingWithTildeInPath]; + + // SSH key file selection + if (contextInfo == sshSSHKeyButton) { + if (returnCode == NSCancelButton) { + [favoritesController setValue:[NSNumber numberWithInt:NSOffState] forKeyPath:@"selection.sshKeyLocationEnabled"]; + return; + } + [favoritesController setValue:abbreviatedFileName forKeyPath:@"selection.sshKeyLocation"]; + [self setSshKeyLocation:abbreviatedFileName]; + + // SSL key file selection + } else if (contextInfo == standardSSLKeyFileButton || contextInfo == socketSSLKeyFileButton) { + if (returnCode == NSCancelButton) { + [favoritesController setValue:[NSNumber numberWithInt:NSOffState] forKeyPath:@"selection.sslKeyFileLocationEnabled"]; + [favoritesController setValue:nil forKeyPath:@"selection.sslKeyFileLocation"]; + return; + } + [favoritesController setValue:abbreviatedFileName forKeyPath:@"selection.sslKeyFileLocation"]; + + // SSL certificate file selection + } else if (contextInfo == standardSSLCertificateButton || contextInfo == socketSSLCertificateButton) { + if (returnCode == NSCancelButton) { + [favoritesController setValue:[NSNumber numberWithInt:NSOffState] forKeyPath:@"selection.sslCertificateFileLocationEnabled"]; + [favoritesController setValue:nil forKeyPath:@"selection.sslCertificateFileLocation"]; + return; + } + [favoritesController setValue:abbreviatedFileName forKeyPath:@"selection.sslCertificateFileLocation"]; + + // SSL CA certificate file selection + } else if (contextInfo == standardSSLCACertButton || contextInfo == socketSSLCACertButton) { + if (returnCode == NSCancelButton) { + [favoritesController setValue:[NSNumber numberWithInt:NSOffState] forKeyPath:@"selection.sslCACertFileLocationEnabled"]; + [favoritesController setValue:nil forKeyPath:@"selection.sslCACertFileLocation"]; + return; + } + [favoritesController setValue:abbreviatedFileName forKeyPath:@"selection.sslCACertFileLocation"]; } - [favoritesController setValue:[[openPanel filename] stringByAbbreviatingWithTildeInPath] forKeyPath:@"selection.sshKeyLocation"]; } #pragma mark - diff --git a/sequel-pro.xcodeproj/project.pbxproj b/sequel-pro.xcodeproj/project.pbxproj index 011b5723..47dcb7e4 100644 --- a/sequel-pro.xcodeproj/project.pbxproj +++ b/sequel-pro.xcodeproj/project.pbxproj @@ -210,6 +210,7 @@ 589235321020C1230011DE00 /* SPHistoryController.m in Sources */ = {isa = PBXBuildFile; fileRef = 589235301020C1230011DE00 /* SPHistoryController.m */; }; 589582151154F8F400EDCC28 /* SPMainThreadTrampoline.m in Sources */ = {isa = PBXBuildFile; fileRef = 589582141154F8F400EDCC28 /* SPMainThreadTrampoline.m */; }; 589ED05B11E0ACD100C1DCEA /* DMLocalizedNib.m in Sources */ = {isa = PBXBuildFile; fileRef = 589ED05A11E0ACD100C1DCEA /* DMLocalizedNib.m */; }; + 58A137CD123ED5E6000B1B75 /* titlebarlock.png in Resources */ = {isa = PBXBuildFile; fileRef = 58A137CC123ED5E6000B1B75 /* titlebarlock.png */; }; 58A8A72711A0149100B95749 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 58A8A72611A0149100B95749 /* MainWindow.xib */; }; 58A8A79111A036C000B95749 /* SPWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 58A8A79011A036C000B95749 /* SPWindowController.m */; }; 58B9074A11BD9B34000826E5 /* overflowImage.png in Resources */ = {isa = PBXBuildFile; fileRef = 58B9070A11BD9B34000826E5 /* overflowImage.png */; }; @@ -805,6 +806,7 @@ 589582131154F8F400EDCC28 /* SPMainThreadTrampoline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPMainThreadTrampoline.h; sourceTree = ""; }; 589582141154F8F400EDCC28 /* SPMainThreadTrampoline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPMainThreadTrampoline.m; sourceTree = ""; }; 589ED05A11E0ACD100C1DCEA /* DMLocalizedNib.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DMLocalizedNib.m; sourceTree = ""; }; + 58A137CC123ED5E6000B1B75 /* titlebarlock.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = titlebarlock.png; sourceTree = ""; }; 58A8A72411A0148400B95749 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainWindow.xib; sourceTree = ""; }; 58A8A78F11A036C000B95749 /* SPWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPWindowController.h; sourceTree = ""; }; 58A8A79011A036C000B95749 /* SPWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPWindowController.m; sourceTree = ""; }; @@ -1783,6 +1785,7 @@ B5E2C5F90F2353B5007446E0 /* table-property.png */, 17E641B40EF02036001BC333 /* table-small.tiff */, 584F5F8E0F50ACD800036517 /* table-view-small.tiff */, + 58A137CC123ED5E6000B1B75 /* titlebarlock.png */, B57748380F7A8B57003B34F9 /* toolbar-preferences-general.tiff */, B577483E0F7A8B57003B34F9 /* toolbar-preferences-tables.tiff */, B577483B0F7A8B57003B34F9 /* toolbar-preferences-favorites.png */, @@ -2531,6 +2534,7 @@ 17A7773811C52E61001E27B4 /* IndexesView.xib in Resources */, 17D3649811DFE61B00CC9413 /* blue-tick.tiff in Resources */, 58E205FC1234FE4F00A97059 /* KeyTemplate.pdf in Resources */, + 58A137CD123ED5E6000B1B75 /* titlebarlock.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; -- cgit v1.2.3