aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/SPConnectionController.m130
-rw-r--r--Source/SPConstants.h8
-rw-r--r--Source/SPConstants.m36
3 files changed, 104 insertions, 70 deletions
diff --git a/Source/SPConnectionController.m b/Source/SPConnectionController.m
index 2300d2e8..6649595f 100644
--- a/Source/SPConnectionController.m
+++ b/Source/SPConnectionController.m
@@ -147,9 +147,9 @@
NSInteger tableRow = [prefs integerForKey:[prefs boolForKey:SPSelectLastFavoriteUsed] ? SPLastFavoriteIndex : SPDefaultFavorite];
if (tableRow < [favorites count]) {
- previousType = [[[favorites objectAtIndex:tableRow] objectForKey:@"type"] integerValue];
+ previousType = [[[favorites objectAtIndex:tableRow] objectForKey:SPFavoriteTypeKey] integerValue];
[favoritesTable selectRowIndexes:[NSIndexSet indexSetWithIndex:(tableRow + 1)] byExtendingSelection:NO];
- [self resizeTabViewToConnectionType:[[[favorites objectAtIndex:tableRow] objectForKey:@"type"] integerValue] animating:NO];
+ [self resizeTabViewToConnectionType:[[[favorites objectAtIndex:tableRow] objectForKey:SPFavoriteTypeKey] integerValue] animating:NO];
[favoritesTable scrollRowToVisible:[favoritesTable selectedRow]];
}
else {
@@ -900,25 +900,30 @@
// Update key-value properties from the selected favourite, using empty strings where not found
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"] : @"")];
+ // Standard details
+ [self setType:([fav objectForKey:SPFavoriteTypeKey] ? [[fav objectForKey:SPFavoriteTypeKey] integerValue] : SPTCPIPConnection)];
+ [self setName:([fav objectForKey:SPFavoriteNameKey] ? [fav objectForKey:SPFavoriteNameKey] : @"")];
+ [self setHost:([fav objectForKey:SPFavoriteHostKey] ? [fav objectForKey:SPFavoriteHostKey] : @"")];
+ [self setSocket:([fav objectForKey:SPFavoriteSocketKey] ? [fav objectForKey:SPFavoriteSocketKey] : @"")];
+ [self setUser:([fav objectForKey:SPFavoriteUserKey] ? [fav objectForKey:SPFavoriteUserKey] : @"")];
+ [self setPort:([fav objectForKey:SPFavoritePortKey] ? [fav objectForKey:SPFavoritePortKey] : @"")];
+ [self setDatabase:([fav objectForKey:SPFavoriteDatabaseKey] ? [fav objectForKey:SPFavoriteDatabaseKey] : @"")];
+
+ // SSL details
+ [self setUseSSL:([fav objectForKey:SPFavoriteUseSSLKey] ? [[fav objectForKey:SPFavoriteUseSSLKey] intValue] : NSOffState)];
+ [self setSslKeyFileLocationEnabled:([fav objectForKey:SPFavoriteSSLKeyFileLocationEnabledKey] ? [[fav objectForKey:SPFavoriteSSLKeyFileLocationEnabledKey] intValue] : NSOffState)];
+ [self setSslKeyFileLocation:([fav objectForKey:SPFavoriteSSLKeyFileLocationKey] ? [fav objectForKey:SPFavoriteSSLKeyFileLocationKey] : @"")];
+ [self setSslCertificateFileLocationEnabled:([fav objectForKey:SPFavoriteSSLCertificateFileLocationEnabledKey] ? [[fav objectForKey:SPFavoriteSSLCertificateFileLocationEnabledKey] intValue] : NSOffState)];
+ [self setSslCertificateFileLocation:([fav objectForKey:SPFavoriteSSLCertificateFileLocationKey] ? [fav objectForKey:SPFavoriteSSLCertificateFileLocationKey] : @"")];
+ [self setSslCACertFileLocationEnabled:([fav objectForKey:SPFavoriteSSLCACertFileLocationEnabledKey] ? [[fav objectForKey:SPFavoriteSSLCACertFileLocationEnabledKey] intValue] : NSOffState)];
+ [self setSslCACertFileLocation:([fav objectForKey:SPFavoriteSSLCACertFileLocationKey] ? [fav objectForKey:SPFavoriteSSLCACertFileLocationKey] : @"")];
+
+ // SSH details
+ [self setSshHost:([fav objectForKey:SPFavoriteSSHHostKey] ? [fav objectForKey:SPFavoriteSSHHostKey] : @"")];
+ [self setSshUser:([fav objectForKey:SPFavoriteSSHUserKey] ? [fav objectForKey:SPFavoriteSSHUserKey] : @"")];
+ [self setSshKeyLocationEnabled:([fav objectForKey:SPFavoriteSSHKeyLocationEnabledKey] ? [[fav objectForKey:SPFavoriteSSHKeyLocationEnabledKey] intValue] : NSOffState)];
+ [self setSshKeyLocation:([fav objectForKey:SPFavoriteSSHKeyLocationKey] ? [fav objectForKey:SPFavoriteSSHKeyLocationKey] : @"")];
+ [self setSshPort:([fav objectForKey:SPFavoriteSSHPortKey] ? [fav objectForKey:SPFavoriteSSHPortKey] : @"")];
// Trigger an interface update
[self resizeTabViewToConnectionType:[self type] animating:YES];
@@ -927,7 +932,9 @@
// keychain details so we can pass around only those details if the password doesn't change
connectionKeychainItemName = [[keychain nameForFavoriteName:[self valueForKeyPath:@"selectedFavorite.name"] id:[self valueForKeyPath:@"selectedFavorite.id"]] retain];
connectionKeychainItemAccount = [[keychain accountForUser:[self valueForKeyPath:@"selectedFavorite.user"] host:(([self type] == SPSocketConnection)?@"localhost":[self valueForKeyPath:@"selectedFavorite.host"]) database:[self valueForKeyPath:@"selectedFavorite.database"]] retain];
+
[self setPassword:[keychain getPasswordForName:connectionKeychainItemName account:connectionKeychainItemAccount]];
+
if (![[self password] length]) {
[self setPassword:nil];
[connectionKeychainItemName release], connectionKeychainItemName = nil;
@@ -937,7 +944,9 @@
// And the same for the SSH password
connectionSSHKeychainItemName = [[keychain nameForSSHForFavoriteName:[self valueForKeyPath:@"selectedFavorite.name"] id:[self valueForKeyPath:@"selectedFavorite.id"]] retain];
connectionSSHKeychainItemAccount = [[keychain accountForSSHUser:[self valueForKeyPath:@"selectedFavorite.sshUser"] sshHost:[self valueForKeyPath:@"selectedFavorite.sshHost"]] retain];
+
[self setSshPassword:[keychain getPasswordForName:connectionSSHKeychainItemName account:connectionSSHKeychainItemAccount]];
+
if (![[self sshPassword] length]) {
[self setSshPassword:nil];
[connectionSSHKeychainItemName release], connectionSSHKeychainItemName = nil;
@@ -946,21 +955,18 @@
[prefs setInteger:([favoritesTable selectedRow] - 1) forKey:SPLastFavoriteIndex];
-
// Set first responder to password field if it is empty
- switch([self type]) {
+ switch ([self type])
+ {
case SPTCPIPConnection:
- if(![[standardPasswordField stringValue] length])
- [[tableDocument parentWindow] makeFirstResponder:standardPasswordField];
- break;
+ if (![[standardPasswordField stringValue] length]) [[tableDocument parentWindow] makeFirstResponder:standardPasswordField];
+ break;
case SPSocketConnection:
- if(![[socketPasswordField stringValue] length])
- [[tableDocument parentWindow] makeFirstResponder:socketPasswordField];
- break;
+ if (![[socketPasswordField stringValue] length]) [[tableDocument parentWindow] makeFirstResponder:socketPasswordField];
+ break;
case SPSSHTunnelConnection:
- if(![[sshPasswordField stringValue] length])
- [[tableDocument parentWindow] makeFirstResponder:sshPasswordField];
- break;
+ if (![[sshPasswordField stringValue] length]) [[tableDocument parentWindow] makeFirstResponder:sshPasswordField];
+ break;
}
}
@@ -982,9 +988,11 @@
{
NSString *thePassword, *theSSHPassword;
NSNumber *favoriteid = [NSNumber numberWithInteger:[[NSString stringWithFormat:@"%f", [[NSDate date] timeIntervalSince1970]] hash]];
- NSString *favoriteName = [[self name] length]?[self name]:[NSString stringWithFormat:@"%@@%@", ([self user] && [[self user] length])?[self user]:@"anonymous", (([self type] == SPSocketConnection)?@"localhost":[self host])];
- if (![[self name] length] && [self database] && ![[self database] isEqualToString:@""])
+ NSString *favoriteName = [[self name] length] ? [self name]:[NSString stringWithFormat:@"%@@%@", ([self user] && [[self user] length])?[self user] : @"anonymous", (([self type] == SPSocketConnection) ? @"localhost" : [self host])];
+
+ if (![[self name] length] && [self database] && ![[self database] isEqualToString:@""]) {
favoriteName = [NSString stringWithFormat:@"%@ %@", [self database], favoriteName];
+ }
// Ensure that host is not empty if this is a TCP/IP or SSH connection
if (([self type] == SPTCPIPConnection || [self type] == SPSSHTunnelConnection) && ![[self host] length]) {
@@ -1003,14 +1011,19 @@
// Construct the favorite details - cannot use only dictionaryWithObjectsAndKeys for possible nil values.
NSMutableDictionary *newFavorite = [NSMutableDictionary dictionaryWithObjectsAndKeys:
- [NSNumber numberWithInteger:[self type]], @"type",
- favoriteName, @"name",
- favoriteid, @"id",
+ [NSNumber numberWithInteger:[self type]], SPFavoriteTypeKey,
+ favoriteName, SPFavoriteNameKey,
+ favoriteid, SPFavoriteIDKey,
nil];
- if ([self host]) [newFavorite setObject:[self host] forKey:@"host"];
- 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"];
+
+ // Standard details
+ if ([self host]) [newFavorite setObject:[self host] forKey:SPFavoriteHostKey];
+ if ([self socket]) [newFavorite setObject:[self socket] forKey:SPFavoriteSocketKey];
+ if ([self user]) [newFavorite setObject:[self user] forKey:SPFavoriteUserKey];
+ if ([self port]) [newFavorite setObject:[self port] forKey:SPFavoritePortKey];
+ if ([self database]) [newFavorite setObject:[self database] forKey:SPFavoriteDatabaseKey];
+
+ // SSL details
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"];
@@ -1018,41 +1031,44 @@
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"];
- [newFavorite setObject:[NSNumber numberWithInt:[self sshKeyLocationEnabled]] forKey:@"sshKeyLocationEnabled"];
- if ([self sshKeyLocation]) [newFavorite setObject:[self sshKeyLocation] forKey:@"sshKeyLocation"];
- if ([self sshPort]) [newFavorite setObject:[self sshPort] forKey:@"sshPort"];
+
+ // SSH details
+ if ([self sshHost]) [newFavorite setObject:[self sshHost] forKey:SPFavoriteSSHHostKey];
+ if ([self sshUser]) [newFavorite setObject:[self sshUser] forKey:SPFavoriteSSHUserKey];
+ if ([self sshPort]) [newFavorite setObject:[self sshPort] forKey:SPFavoriteSSHPortKey];
+ [newFavorite setObject:[NSNumber numberWithInt:[self sshKeyLocationEnabled]] forKey:SPFavoriteSSHKeyLocationEnabledKey];
+ if ([self sshKeyLocation]) [newFavorite setObject:[self sshKeyLocation] forKey:SPFavoriteSSHKeyLocationKey];
// Add the new favorite to the user defaults array
- NSMutableArray *currentFavorites;
- if ([prefs objectForKey:SPFavorites]) {
- currentFavorites = [[NSMutableArray alloc] initWithArray:[prefs objectForKey:SPFavorites]];
- } else {
- currentFavorites = [[NSMutableArray alloc] init];
- }
+ NSMutableArray *currentFavorites = ([prefs objectForKey:SPFavorites]) ? [[NSMutableArray alloc] initWithArray:[prefs objectForKey:SPFavorites]] : [[NSMutableArray alloc] init];
+
[currentFavorites addObject:newFavorite];
+
[prefs setObject:[NSArray arrayWithArray:currentFavorites] forKey:SPFavorites];
+
[currentFavorites release];
// Add the password to keychain as appropriate
thePassword = [self password];
+
if (mySQLConnection && connectionKeychainItemName) {
thePassword = [keychain getPasswordForName:connectionKeychainItemName account:connectionKeychainItemAccount];
}
- if (thePassword && ![thePassword isEqualToString:@""]) {
+
+ if (thePassword && (![thePassword isEqualToString:@""])) {
[keychain addPassword:thePassword
forName:[keychain nameForFavoriteName:favoriteName id:[NSString stringWithFormat:@"%lld", [favoriteid longLongValue]]]
- account:[keychain accountForUser:[self user] host:(([self type] == SPSocketConnection)?@"localhost":[self host]) database:[self database]]];
+ account:[keychain accountForUser:[self user] host:(([self type] == SPSocketConnection) ? @"localhost" : [self host]) database:[self database]]];
}
// Add the SSH password to keychain as appropriate
theSSHPassword = [self sshPassword];
+
if (mySQLConnection && connectionSSHKeychainItemName) {
theSSHPassword = [keychain getPasswordForName:connectionSSHKeychainItemName account:connectionSSHKeychainItemAccount];
}
- if (theSSHPassword && ![theSSHPassword isEqualToString:@""]) {
+
+ if (theSSHPassword && (![theSSHPassword isEqualToString:@""])) {
[keychain addPassword:theSSHPassword
forName:[keychain nameForSSHForFavoriteName:favoriteName id:[NSString stringWithFormat:@"%lld", [favoriteid longLongValue]]]
account:[keychain accountForSSHUser:[self sshUser] sshHost:[self sshHost]]];
@@ -1060,9 +1076,11 @@
// Update the favorites list and selection
[self updateFavorites];
+
[favoritesTable selectRowIndexes:[NSIndexSet indexSetWithIndex:[favorites count]-1] byExtendingSelection:NO];
[favoritesTable scrollRowToVisible:[favoritesTable selectedRow]];
+ // Update the favorites popup button in the preferences
[[[[NSApp delegate] preferenceController] generalPreferencePane] updateDefaultFavoritePopup];
}
diff --git a/Source/SPConstants.h b/Source/SPConstants.h
index 6e20a5b3..0b51fb17 100644
--- a/Source/SPConstants.h
+++ b/Source/SPConstants.h
@@ -411,4 +411,12 @@ extern NSString *SPFavoriteSocketKey;
extern NSString *SPFavoriteSSHHostKey;
extern NSString *SPFavoriteSSHPortKey;
extern NSString *SPFavoriteSSHUserKey;
+extern NSString *SPFavoriteSSHKeyLocationEnabledKey;
extern NSString *SPFavoriteSSHKeyLocationKey;
+extern NSString *SPFavoriteUseSSLKey;
+extern NSString *SPFavoriteSSLKeyFileLocationEnabledKey;
+extern NSString *SPFavoriteSSLKeyFileLocationKey;
+extern NSString *SPFavoriteSSLCertificateFileLocationEnabledKey;
+extern NSString *SPFavoriteSSLCertificateFileLocationKey;
+extern NSString *SPFavoriteSSLCACertFileLocationEnabledKey;
+extern NSString *SPFavoriteSSLCACertFileLocationKey;
diff --git a/Source/SPConstants.m b/Source/SPConstants.m
index 17e20849..637e046e 100644
--- a/Source/SPConstants.m
+++ b/Source/SPConstants.m
@@ -218,17 +218,25 @@ NSString *SPPreferenceToolbarEditor = @"SPPreferenceToolbarEditor";
NSString *SPPreferenceToolbarShortcuts = @"SPPreferenceToolbarShortcuts";
// Connection favorite keys
-NSString *SPFavoritesRootKey = @"Favorites Root";
-NSString *SPFavoriteChildrenKey = @"Children";
-NSString *SPFavoriteIDKey = @"id";
-NSString *SPFavoriteNameKey = @"name";
-NSString *SPFavoriteDatabaseKey = @"database";
-NSString *SPFavoriteHostKey = @"host";
-NSString *SPFavoritePortKey = @"port";
-NSString *SPFavoriteUserKey = @"user";
-NSString *SPFavoriteTypeKey = @"type";
-NSString *SPFavoriteSocketKey = @"socket";
-NSString *SPFavoriteSSHHostKey = @"sshHost";
-NSString *SPFavoriteSSHPortKey = @"sshPort";
-NSString *SPFavoriteSSHUserKey = @"sshUser";
-NSString *SPFavoriteSSHKeyLocationKey = @"sshKeyLocationEnabled";
+NSString *SPFavoritesRootKey = @"Favorites Root";
+NSString *SPFavoriteChildrenKey = @"Children";
+NSString *SPFavoriteIDKey = @"id";
+NSString *SPFavoriteNameKey = @"name";
+NSString *SPFavoriteDatabaseKey = @"database";
+NSString *SPFavoriteHostKey = @"host";
+NSString *SPFavoritePortKey = @"port";
+NSString *SPFavoriteUserKey = @"user";
+NSString *SPFavoriteTypeKey = @"type";
+NSString *SPFavoriteSocketKey = @"socket";
+NSString *SPFavoriteSSHHostKey = @"sshHost";
+NSString *SPFavoriteSSHPortKey = @"sshPort";
+NSString *SPFavoriteSSHUserKey = @"sshUser";
+NSString *SPFavoriteSSHKeyLocationEnabledKey = @"sshKeyLocationEnabled";
+NSString *SPFavoriteSSHKeyLocationKey = @"sshKeyLocation";
+NSString *SPFavoriteUseSSLKey = @"useSSL";
+NSString *SPFavoriteSSLKeyFileLocationEnabledKey = @"sslKeyFileLocationEnabled";
+NSString *SPFavoriteSSLKeyFileLocationKey = @"sslKeyFileLocation";
+NSString *SPFavoriteSSLCertificateFileLocationEnabledKey = @"sslCertificateFileLocationEnabled";
+NSString *SPFavoriteSSLCertificateFileLocationKey = @"sslCertificateFileLocation";
+NSString *SPFavoriteSSLCACertFileLocationEnabledKey = @"sslCACertFileLocationEnabled";
+NSString *SPFavoriteSSLCACertFileLocationKey = @"sslCACertFileLocation";