adium 5903:680a579a4b3c: Refresh tokens are now stored in the ke...

commits at adium.im commits at adium.im
Wed Apr 1 10:37:24 UTC 2015


details:	http://hg.adium.im/adium/rev/680a579a4b3c
revision:	5903:680a579a4b3c
branch:		GoogleOAuth2
author:		Thijs Alkemade <me at thijsalkema.de>
date:		Wed Apr 01 12:37:07 2015 +0200

Refresh tokens are now stored in the keychain and used on each connect. Moved some code to AIPurpleGTalkAccount, where it makes more sense.

diffs (truncated from 1773 to 1000 lines):

diff -r 16b03b8cc757 -r 680a579a4b3c Plugins/Purple Service/AIPurpleGTalkAccount.h
--- a/Plugins/Purple Service/AIPurpleGTalkAccount.h	Wed Apr 01 12:05:55 2015 +0200
+++ b/Plugins/Purple Service/AIPurpleGTalkAccount.h	Wed Apr 01 12:37:07 2015 +0200
@@ -16,8 +16,14 @@
 
 #import "ESPurpleJabberAccount.h"
 
+#define KEY_GTALK_CODE @"GTalk:Code"
+
+#define ADIUM_GTALK_CLIENT_ID @"853036734951.apps.googleusercontent.com"
+#define ADIUM_GTALK_SECRET @"TSXNUaq34k_0YU7DZT4HbmQd"
+
 @interface AIPurpleGTalkAccount : ESPurpleJabberAccount {
-
+	NSMutableData *response;
+	NSURLConnection *conn;
 }
 
 @end
diff -r 16b03b8cc757 -r 680a579a4b3c Plugins/Purple Service/AIPurpleGTalkAccount.m
--- a/Plugins/Purple Service/AIPurpleGTalkAccount.m	Wed Apr 01 12:05:55 2015 +0200
+++ b/Plugins/Purple Service/AIPurpleGTalkAccount.m	Wed Apr 01 12:37:07 2015 +0200
@@ -16,6 +16,13 @@
 
 #import "AIPurpleGTalkAccount.h"
 #import "auth_gtalk.h"
+#import "AIKeychain.h"
+
+#import "JSONKit.h"
+
+#import "AIService.h"
+
+#import <Adium/AIAccountControllerProtocol.h>
 
 @implementation AIPurpleGTalkAccount
 
@@ -40,6 +47,13 @@
 	return [completeUserName UTF8String];
 }
 
+- (void)dealloc {
+	[response release];
+	[conn release];
+	
+	[super dealloc];
+}
+
 - (NSString *)serverSuffix
 {
 	return @"@gmail.com";
@@ -87,35 +101,119 @@
 
 /* Add the authentication mechanism for X-OAUTH2. Note that if the server offers it,
  * it will be used preferentially over any other mechanism e.g. PLAIN. */
-- (void)setGtalkMechEnabled:(BOOL)inEnabled
+- (void)setGTalkMechEnabled:(BOOL)inEnabled
 {
-	static BOOL enabledGtalkMech = NO;
-	if (inEnabled != enabledGtalkMech) {
+	static BOOL enabledGTalkMech = NO;
+	if (inEnabled != enabledGTalkMech) {
 		if (inEnabled)
 			jabber_auth_add_mech(jabber_auth_get_gtalk_mech());
 		else
 			jabber_auth_remove_mech(jabber_auth_get_gtalk_mech());
 		
-		enabledGtalkMech = inEnabled;
+		enabledGTalkMech = inEnabled;
 	}
 }
 
 - (void)connect
 {
-	[self setGtalkMechEnabled:YES];
-	[super connect];
+	NSString *refresh_token = [[AIKeychain defaultKeychain_error:NULL] findGenericPasswordForService:self.service.serviceID
+																							 account:self.UID
+																						keychainItem:NULL error:NULL];
+	
+	if (refresh_token) {
+		[self useRefreshToken:refresh_token];
+	} else {
+		[self requestAccessToken];
+	}
 }
 
 - (void)didConnect
 {
-	[self setGtalkMechEnabled:NO];
+	[self setGTalkMechEnabled:NO];
 	[super didConnect];
 }
 
 - (void)didDisconnect
 {
-	[self setGtalkMechEnabled:NO];
+	[self setGTalkMechEnabled:NO];
 	[super didDisconnect];
 }
 
+- (void)useRefreshToken:(NSString *)token {
+	NSString *body = [NSString stringWithFormat:@"refresh_token=%@&client_id=" ADIUM_GTALK_CLIENT_ID
+					  @"&client_secret=" ADIUM_GTALK_SECRET
+					  @"&redirect_uri=urn:ietf:wg:oauth:2.0:oob"
+					  @"&grant_type=refresh_token", token];
+	
+	NSData *data = [body dataUsingEncoding:NSUTF8StringEncoding];
+	
+	NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://www.googleapis.com/oauth2/v3/token"]];
+	[request setHTTPMethod:@"POST"];
+	[request setValue:@"application/x-www-form-urlencoded ; charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
+	[request setValue:[NSString stringWithFormat:@"%u", (unsigned int)[data length]] forHTTPHeaderField:@"Content-Length"];
+	[request setHTTPBody:data];
+	
+	AILogWithSignature(@"%@", request);
+	
+	conn = [[NSURLConnection connectionWithRequest:request delegate:self] retain];
+	
+	response = [[NSMutableData alloc] init];
+}
+
+- (void)requestAccessToken {
+	NSString *body = [NSString stringWithFormat:@"code=%@&client_id=" ADIUM_GTALK_CLIENT_ID
+					  @"&client_secret=" ADIUM_GTALK_SECRET
+					  @"&redirect_uri=urn:ietf:wg:oauth:2.0:oob"
+					  @"&grant_type=authorization_code", [self preferenceForKey:KEY_GTALK_CODE group:GROUP_ACCOUNT_STATUS]];
+	
+	NSData *data = [body dataUsingEncoding:NSUTF8StringEncoding];
+	
+	NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://www.googleapis.com/oauth2/v3/token"]];
+	[request setHTTPMethod:@"POST"];
+	[request setValue:@"application/x-www-form-urlencoded ; charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
+	[request setValue:[NSString stringWithFormat:@"%u", (unsigned int)[data length]] forHTTPHeaderField:@"Content-Length"];
+	[request setHTTPBody:data];
+	
+	AILogWithSignature(@"%@", request);
+	
+	conn = [[NSURLConnection connectionWithRequest:request delegate:self] retain];
+	
+	response = [[NSMutableData alloc] init];
+}
+
+- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)urlResponse {
+	AILogWithSignature(@"%@", urlResponse);
+}
+
+- (void)connection:(NSURLConnection *)inConnection didReceiveData:(NSData *)data {
+	[response appendData:data];
+}
+
+- (void)connectionDidFinishLoading:(NSURLConnection *)inConnection {
+	NSError *error = nil;
+	NSDictionary *responseDict = [response objectFromJSONDataWithParseOptions:JKParseOptionNone error:&error];
+	
+	AILogWithSignature(@"%@", responseDict);
+	
+	[[adium accountController] setPassword:[responseDict objectForKey:@"access_token"] forAccount:self];
+	
+	if ([responseDict objectForKey:@"refresh_token"]) {
+		[[AIKeychain defaultKeychain_error:NULL] deleteGenericPasswordForService:self.service.serviceID
+																		 account:self.UID
+																		   error:NULL];
+		[[AIKeychain defaultKeychain_error:NULL] addGenericPassword:[responseDict objectForKey:@"refresh_token"]
+														 forService:self.service.serviceID
+															account:self.UID
+													   keychainItem:NULL
+															  error:NULL];
+	}
+	
+	[self setGTalkMechEnabled:YES];
+	[super connect];
+}
+
+-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
+	AILogWithSignature(@"did fail");
+}
+
 @end
diff -r 16b03b8cc757 -r 680a579a4b3c Plugins/Purple Service/AIPurpleGTalkAccountViewController.h
--- a/Plugins/Purple Service/AIPurpleGTalkAccountViewController.h	Wed Apr 01 12:05:55 2015 +0200
+++ b/Plugins/Purple Service/AIPurpleGTalkAccountViewController.h	Wed Apr 01 12:37:07 2015 +0200
@@ -21,13 +21,8 @@
 	
 	IBOutlet NSTextField *label_grant;
 	IBOutlet NSTextField *label_code;
-	IBOutlet NSButton *button_submit;
-	
-	NSMutableData *response;
-	NSURLConnection *conn;
 }
 
 -(IBAction)requestAccess:(id)sender;
--(IBAction)submit:(id)sender;
 
 @end
diff -r 16b03b8cc757 -r 680a579a4b3c Plugins/Purple Service/AIPurpleGTalkAccountViewController.m
--- a/Plugins/Purple Service/AIPurpleGTalkAccountViewController.m	Wed Apr 01 12:05:55 2015 +0200
+++ b/Plugins/Purple Service/AIPurpleGTalkAccountViewController.m	Wed Apr 01 12:37:07 2015 +0200
@@ -15,13 +15,8 @@
  */
 
 #import "AIPurpleGTalkAccountViewController.h"
+#import "AIPurpleGTalkAccount.h"
 
-#import "JSONKit.h"
-
-#import <Adium/AIAccountControllerProtocol.h>
-
-#define ADIUM_GTALK_CLIENT_ID @"853036734951.apps.googleusercontent.com"
-#define ADIUM_GTALK_SECRET @"TSXNUaq34k_0YU7DZT4HbmQd"
 
 @implementation AIPurpleGTalkAccountViewController
 
@@ -29,13 +24,6 @@
 	return @"ESPurpleGTalkAccountView";
 }
 
-- (void)dealloc {
-	[response release];
-	[conn release];
-	
-	[super dealloc];
-}
-
 - (void)awakeFromNib
 {
 	[super awakeFromNib];
@@ -62,6 +50,9 @@
 					forKey:KEY_JABBER_VERIFY_CERTS group:GROUP_ACCOUNT_STATUS];
 	[account setPreference:[NSNumber numberWithBool:FALSE]
 					forKey:KEY_JABBER_ALLOW_PLAINTEXT group:GROUP_ACCOUNT_STATUS];
+	
+	[account setPreference:textField_code.stringValue
+					forKey:KEY_GTALK_CODE group:GROUP_ACCOUNT_STATUS];
 }
 
 - (IBAction)requestAccess:(id)sender {
@@ -82,55 +73,6 @@
 	[label_grant setHidden:FALSE];
 	[label_code setHidden:FALSE];
 	[textField_code setHidden:FALSE];
-	[button_submit setHidden:FALSE];
-}
-
-- (IBAction)submit:(id)sender {
-	NSLog(@"Token: %@", textField_code.stringValue);
-	
-	NSString *body = [NSString stringWithFormat:@"code=%@&client_id=" ADIUM_GTALK_CLIENT_ID
-					  @"&client_secret=" ADIUM_GTALK_SECRET
-					  @"&redirect_uri=urn:ietf:wg:oauth:2.0:oob"
-					  @"&grant_type=authorization_code", textField_code.stringValue];
-	
-	NSData *data = [body dataUsingEncoding:NSUTF8StringEncoding];
-	
-	NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://www.googleapis.com/oauth2/v3/token"]];
-	[request setHTTPMethod:@"POST"];
-	[request setValue:@"application/x-www-form-urlencoded ; charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
-	[request setValue:[NSString stringWithFormat:@"%u", (unsigned int)[data length]] forHTTPHeaderField:@"Content-Length"];
-	[request setHTTPBody:data];
-	
-	AILogWithSignature(@"%@", request);
-	
-	conn = [[NSURLConnection connectionWithRequest:request delegate:self] retain];
-	
-	response = [[NSMutableData alloc] init];
-}
-
-- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)urlResponse {
-	AILogWithSignature(@"%@", urlResponse);
-}
-
-- (void)connection:(NSURLConnection *)inConnection didReceiveData:(NSData *)data {
-	[response appendData:data];
-}
-
-- (void)connectionDidFinishLoading:(NSURLConnection *)inConnection {
-//	NSString *responseString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
-	
-//	NSLog(@"%@", responseString);
-	
-	NSError *error = nil;
-	NSDictionary *responseDict = [response objectFromJSONDataWithParseOptions:JKParseOptionNone error:&error];
-	
-	AILogWithSignature(@"%@", responseDict);
-	
-	[[adium accountController] setPassword:[responseDict objectForKey:@"access_token"] forAccount:account];
-}
-
--(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
-	AILogWithSignature(@"did fail");
 }
 
 @end
diff -r 16b03b8cc757 -r 680a579a4b3c Plugins/Purple Service/Resources/en.lproj/ESPurpleGTalkAccountView.nib/designable.nib
--- a/Plugins/Purple Service/Resources/en.lproj/ESPurpleGTalkAccountView.nib/designable.nib	Wed Apr 01 12:05:55 2015 +0200
+++ b/Plugins/Purple Service/Resources/en.lproj/ESPurpleGTalkAccountView.nib/designable.nib	Wed Apr 01 12:37:07 2015 +0200
@@ -45,52 +45,26 @@
 				<reference key="NSNextResponder"/>
 				<int key="NSvFlags">256</int>
 				<array class="NSMutableArray" key="NSSubviews">
-					<object class="NSButton" id="793144240">
+					<object class="NSTextField" id="273440277">
 						<reference key="NSNextResponder" ref="837853317"/>
-						<int key="NSvFlags">-2147483392</int>
-						<string key="NSFrame">{{186, 14}, {84, 32}}</string>
+						<int key="NSvFlags">-2147483380</int>
+						<string key="NSFrame">{{164, 20}, {273, 22}}</string>
 						<reference key="NSSuperview" ref="837853317"/>
 						<reference key="NSWindow"/>
 						<reference key="NSNextKeyView"/>
+						<string key="NSReuseIdentifierKey">_NS:9</string>
 						<bool key="NSEnabled">YES</bool>
-						<object class="NSButtonCell" key="NSCell" id="948437734">
-							<int key="NSCellFlags">67108864</int>
-							<int key="NSCellFlags2">134217728</int>
-							<string key="NSContents">Submit</string>
+						<object class="NSTextFieldCell" key="NSCell" id="263913129">
+							<int key="NSCellFlags">-1804599231</int>
+							<int key="NSCellFlags2">272630784</int>
+							<string key="NSContents"/>
 							<object class="NSFont" key="NSSupport" id="745543233">
 								<bool key="IBIsSystemFont">YES</bool>
 								<double key="NSSize">13</double>
 								<int key="NSfFlags">1044</int>
 							</object>
-							<reference key="NSControlView" ref="793144240"/>
-							<int key="NSButtonFlags">-2038284288</int>
-							<int key="NSButtonFlags2">1</int>
-							<reference key="NSAlternateImage" ref="745543233"/>
-							<string key="NSAlternateContents"/>
-							<object class="NSMutableString" key="NSKeyEquivalent">
-								<characters key="NS.bytes"/>
-							</object>
-							<int key="NSPeriodicDelay">200</int>
-							<int key="NSPeriodicInterval">25</int>
-						</object>
-						<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
-					</object>
-					<object class="NSTextField" id="358495968">
-						<reference key="NSNextResponder" ref="837853317"/>
-						<int key="NSvFlags">-2147483380</int>
-						<string key="NSFrame">{{164, 50}, {273, 22}}</string>
-						<reference key="NSSuperview" ref="837853317"/>
-						<reference key="NSWindow"/>
-						<reference key="NSNextKeyView" ref="793144240"/>
-						<string key="NSReuseIdentifierKey">_NS:9</string>
-						<bool key="NSEnabled">YES</bool>
-						<object class="NSTextFieldCell" key="NSCell" id="934484268">
-							<int key="NSCellFlags">-1804599231</int>
-							<int key="NSCellFlags2">272630784</int>
-							<string key="NSContents"/>
-							<reference key="NSSupport" ref="745543233"/>
 							<string key="NSCellIdentifier">_NS:9</string>
-							<reference key="NSControlView" ref="358495968"/>
+							<reference key="NSControlView" ref="273440277"/>
 							<bool key="NSDrawsBackground">YES</bool>
 							<object class="NSColor" key="NSBackgroundColor" id="427835941">
 								<int key="NSColorSpace">6</int>
@@ -114,23 +88,23 @@
 						<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
 						<int key="NSTextFieldAlignmentRectInsetsVersion">1</int>
 					</object>
-					<object class="NSTextField" id="957487027">
+					<object class="NSTextField" id="871711991">
 						<reference key="NSNextResponder" ref="837853317"/>
 						<int key="NSvFlags">-2147483380</int>
-						<string key="NSFrame">{{18, 55}, {140, 17}}</string>
+						<string key="NSFrame">{{18, 25}, {140, 17}}</string>
 						<reference key="NSSuperview" ref="837853317"/>
 						<reference key="NSWindow"/>
-						<reference key="NSNextKeyView" ref="358495968"/>
+						<reference key="NSNextKeyView" ref="273440277"/>
 						<string key="NSReuseIdentifierKey">_NS:526</string>
 						<string key="NSHuggingPriority">{251, 750}</string>
 						<bool key="NSEnabled">YES</bool>
-						<object class="NSTextFieldCell" key="NSCell" id="970336257">
+						<object class="NSTextFieldCell" key="NSCell" id="466605712">
 							<int key="NSCellFlags">68157504</int>
 							<int key="NSCellFlags2">71304192</int>
 							<string key="NSContents">Code:</string>
 							<reference key="NSSupport" ref="745543233"/>
 							<string key="NSCellIdentifier">_NS:526</string>
-							<reference key="NSControlView" ref="957487027"/>
+							<reference key="NSControlView" ref="871711991"/>
 							<object class="NSColor" key="NSBackgroundColor" id="701108434">
 								<int key="NSColorSpace">6</int>
 								<string key="NSCatalogName">System</string>
@@ -140,7 +114,7 @@
 									<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
 								</object>
 							</object>
-							<object class="NSColor" key="NSTextColor" id="85901786">
+							<object class="NSColor" key="NSTextColor" id="316283793">
 								<int key="NSColorSpace">6</int>
 								<string key="NSCatalogName">System</string>
 								<string key="NSColorName">labelColor</string>
@@ -150,25 +124,25 @@
 						<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
 						<int key="NSTextFieldAlignmentRectInsetsVersion">1</int>
 					</object>
-					<object class="NSTextField" id="74232667">
+					<object class="NSTextField" id="872477558">
 						<reference key="NSNextResponder" ref="837853317"/>
 						<int key="NSvFlags">-2147483380</int>
-						<string key="NSFrame">{{18, 80}, {421, 17}}</string>
+						<string key="NSFrame">{{18, 50}, {421, 17}}</string>
 						<reference key="NSSuperview" ref="837853317"/>
 						<reference key="NSWindow"/>
-						<reference key="NSNextKeyView" ref="957487027"/>
+						<reference key="NSNextKeyView" ref="871711991"/>
 						<string key="NSReuseIdentifierKey">_NS:9</string>
 						<string key="NSAntiCompressionPriority">{250, 750}</string>
 						<bool key="NSEnabled">YES</bool>
-						<object class="NSTextFieldCell" key="NSCell" id="492600036">
+						<object class="NSTextFieldCell" key="NSCell" id="132485513">
 							<int key="NSCellFlags">67108864</int>
 							<int key="NSCellFlags2">272629760</int>
 							<string key="NSContents">Please grant Adium access to your account in your browser.</string>
 							<reference key="NSSupport" ref="745543233"/>
 							<string key="NSCellIdentifier">_NS:9</string>
-							<reference key="NSControlView" ref="74232667"/>
+							<reference key="NSControlView" ref="872477558"/>
 							<reference key="NSBackgroundColor" ref="701108434"/>
-							<reference key="NSTextColor" ref="85901786"/>
+							<reference key="NSTextColor" ref="316283793"/>
 						</object>
 						<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
 						<bool key="NSControlAutosetMaxLayoutWidth">YES</bool>
@@ -177,10 +151,10 @@
 					<object class="NSButton" id="272517914">
 						<reference key="NSNextResponder" ref="837853317"/>
 						<int key="NSvFlags">256</int>
-						<string key="NSFrame">{{158, 98}, {140, 32}}</string>
+						<string key="NSFrame">{{158, 68}, {140, 32}}</string>
 						<reference key="NSSuperview" ref="837853317"/>
 						<reference key="NSWindow"/>
-						<reference key="NSNextKeyView" ref="74232667"/>
+						<reference key="NSNextKeyView" ref="872477558"/>
 						<bool key="NSEnabled">YES</bool>
 						<object class="NSButtonCell" key="NSCell" id="712274320">
 							<int key="NSCellFlags">67108864</int>
@@ -201,7 +175,7 @@
 						<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
 					</object>
 				</array>
-				<string key="NSFrameSize">{457, 146}</string>
+				<string key="NSFrameSize">{457, 116}</string>
 				<reference key="NSSuperview"/>
 				<reference key="NSWindow"/>
 				<reference key="NSNextKeyView" ref="272517914"/>
@@ -228,7 +202,7 @@
 							<reference key="NSControlView" ref="767871570"/>
 							<int key="NSButtonFlags">1211912448</int>
 							<int key="NSButtonFlags2">2</int>
-							<object class="NSCustomResource" key="NSNormalImage" id="255831293">
+							<object class="NSCustomResource" key="NSNormalImage" id="196206009">
 								<string key="NSClassName">NSImage</string>
 								<string key="NSResourceName">NSSwitch</string>
 							</object>
@@ -825,7 +799,7 @@
 							<reference key="NSControlView" ref="753162121"/>
 							<int key="NSButtonFlags">1211912448</int>
 							<int key="NSButtonFlags2">2</int>
-							<reference key="NSNormalImage" ref="255831293"/>
+							<reference key="NSNormalImage" ref="196206009"/>
 							<reference key="NSAlternateImage" ref="10299655"/>
 							<string key="NSAlternateContents"/>
 							<string key="NSKeyEquivalent"/>
@@ -860,7 +834,7 @@
 							<reference key="NSControlView" ref="8487197"/>
 							<int key="NSButtonFlags">1211912448</int>
 							<int key="NSButtonFlags2">2</int>
-							<reference key="NSNormalImage" ref="255831293"/>
+							<reference key="NSNormalImage" ref="196206009"/>
 							<reference key="NSAlternateImage" ref="10299655"/>
 							<string key="NSAlternateContents"/>
 							<string key="NSKeyEquivalent"/>
@@ -985,7 +959,7 @@
 							<reference key="NSControlView" ref="462740945"/>
 							<int key="NSButtonFlags">1211912448</int>
 							<int key="NSButtonFlags2">2</int>
-							<reference key="NSNormalImage" ref="255831293"/>
+							<reference key="NSNormalImage" ref="196206009"/>
 							<reference key="NSAlternateImage" ref="10299655"/>
 							<string key="NSAlternateContents"/>
 							<string key="NSKeyEquivalent"/>
@@ -1253,18 +1227,10 @@
 					<int key="connectionID">647</int>
 				</object>
 				<object class="IBConnectionRecord">
-					<object class="IBActionConnection" key="connection">
-						<string key="label">submit:</string>
-						<reference key="source" ref="393462939"/>
-						<reference key="destination" ref="793144240"/>
-					</object>
-					<int key="connectionID">657</int>
-				</object>
-				<object class="IBConnectionRecord">
 					<object class="IBOutletConnection" key="connection">
 						<string key="label">textField_code</string>
 						<reference key="source" ref="393462939"/>
-						<reference key="destination" ref="358495968"/>
+						<reference key="destination" ref="273440277"/>
 					</object>
 					<int key="connectionID">658</int>
 				</object>
@@ -1272,7 +1238,7 @@
 					<object class="IBOutletConnection" key="connection">
 						<string key="label">label_grant</string>
 						<reference key="source" ref="393462939"/>
-						<reference key="destination" ref="74232667"/>
+						<reference key="destination" ref="872477558"/>
 					</object>
 					<int key="connectionID">659</int>
 				</object>
@@ -1280,20 +1246,12 @@
 					<object class="IBOutletConnection" key="connection">
 						<string key="label">label_code</string>
 						<reference key="source" ref="393462939"/>
-						<reference key="destination" ref="957487027"/>
+						<reference key="destination" ref="871711991"/>
 					</object>
 					<int key="connectionID">660</int>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBOutletConnection" key="connection">
-						<string key="label">button_submit</string>
-						<reference key="source" ref="393462939"/>
-						<reference key="destination" ref="793144240"/>
-					</object>
-					<int key="connectionID">661</int>
-				</object>
-				<object class="IBConnectionRecord">
-					<object class="IBOutletConnection" key="connection">
 						<string key="label">dataSource</string>
 						<reference key="source" ref="71054177"/>
 						<reference key="destination" ref="393462939"/>
@@ -1404,10 +1362,9 @@
 						<reference key="object" ref="837853317"/>
 						<array class="NSMutableArray" key="children">
 							<reference ref="272517914"/>
-							<reference ref="74232667"/>
-							<reference ref="957487027"/>
-							<reference ref="358495968"/>
-							<reference ref="793144240"/>
+							<reference ref="872477558"/>
+							<reference ref="871711991"/>
+							<reference ref="273440277"/>
 						</array>
 						<reference key="parent" ref="0"/>
 						<string key="objectName">setup</string>
@@ -1885,55 +1842,42 @@
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">648</int>
-						<reference key="object" ref="74232667"/>
+						<reference key="object" ref="872477558"/>
 						<array class="NSMutableArray" key="children">
-							<reference ref="492600036"/>
+							<reference ref="132485513"/>
 						</array>
 						<reference key="parent" ref="837853317"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">649</int>
-						<reference key="object" ref="492600036"/>
-						<reference key="parent" ref="74232667"/>
+						<reference key="object" ref="132485513"/>
+						<reference key="parent" ref="872477558"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">650</int>
-						<reference key="object" ref="957487027"/>
+						<reference key="object" ref="871711991"/>
 						<array class="NSMutableArray" key="children">
-							<reference ref="970336257"/>
+							<reference ref="466605712"/>
 						</array>
 						<reference key="parent" ref="837853317"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">651</int>
-						<reference key="object" ref="970336257"/>
-						<reference key="parent" ref="957487027"/>
+						<reference key="object" ref="466605712"/>
+						<reference key="parent" ref="871711991"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">652</int>
-						<reference key="object" ref="358495968"/>
+						<reference key="object" ref="273440277"/>
 						<array class="NSMutableArray" key="children">
-							<reference ref="934484268"/>
+							<reference ref="263913129"/>
 						</array>
 						<reference key="parent" ref="837853317"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">653</int>
-						<reference key="object" ref="934484268"/>
-						<reference key="parent" ref="358495968"/>
-					</object>
-					<object class="IBObjectRecord">
-						<int key="objectID">654</int>
-						<reference key="object" ref="793144240"/>
-						<array class="NSMutableArray" key="children">
-							<reference ref="948437734"/>
-						</array>
-						<reference key="parent" ref="837853317"/>
-					</object>
-					<object class="IBObjectRecord">
-						<int key="objectID">655</int>
-						<reference key="object" ref="948437734"/>
-						<reference key="parent" ref="793144240"/>
+						<reference key="object" ref="263913129"/>
+						<reference key="parent" ref="273440277"/>
 					</object>
 				</array>
 			</object>
@@ -1980,7 +1924,7 @@
 				<string key="351.CustomClassName">AILocalizationButton</string>
 				<string key="351.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
 				<reference key="39.IBNSViewMetadataGestureRecognizers" ref="0"/>
-				<string key="39.IBPersistedLastKnownCanvasPosition">{499.5, 434}</string>
+				<string key="39.IBPersistedLastKnownCanvasPosition">{499.5, 419}</string>
 				<string key="39.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
 				<string key="411.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
 				<string key="527.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -2025,8 +1969,6 @@
 				<string key="651.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
 				<string key="652.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
 				<string key="653.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
-				<string key="654.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
-				<string key="655.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
 			</dictionary>
 			<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
 			<nil key="activeLocalization"/>
@@ -2034,1132 +1976,7 @@
 			<nil key="sourceID"/>
 			<int key="maxID">661</int>
 		</object>
-		<object class="IBClassDescriber" key="IBDocument.Classes">
-			<array class="NSMutableArray" key="referencedPartialClassDescriptions">
-				<object class="IBPartialClassDescription">
-					<string key="className">AIAccountViewController</string>
-					<string key="superclassName">NSObject</string>
-					<object class="NSMutableDictionary" key="actions">
-						<string key="NS.key.0">changedPreference:</string>
-						<string key="NS.object.0">id</string>
-					</object>
-					<object class="NSMutableDictionary" key="actionInfosByName">
-						<string key="NS.key.0">changedPreference:</string>
-						<object class="IBActionInfo" key="NS.object.0">
-							<string key="name">changedPreference:</string>
-							<string key="candidateClassName">id</string>
-						</object>
-					</object>
-					<dictionary class="NSMutableDictionary" key="outlets">
-						<string key="checkBox_checkMail">NSButton</string>
-						<string key="checkBox_sendTyping">NSButton</string>
-						<string key="label_alias">NSTextField</string>
-						<string key="label_encryption">NSTextField</string>
-						<string key="label_password">NSTextField</string>
-						<string key="label_port">NSTextField</string>
-						<string key="label_server">NSTextField</string>
-						<string key="label_typing">NSTextField</string>
-						<string key="popUp_encryption">NSPopUpButton</string>
-						<string key="progressIndicator_registering">NSProgressIndicator</string>
-						<string key="textField_accountUID">NSTextField</string>
-						<string key="textField_accountUIDLabel">NSTextField</string>
-						<string key="textField_alias">NSTextField</string>
-						<string key="textField_connectHost">NSTextField</string>
-						<string key="textField_connectPort">NSTextField</string>
-						<string key="textField_password">NSTextField</string>
-						<string key="textField_registering">NSTextField</string>
-						<string key="view_auxiliaryTabView">NSTabView</string>
-						<string key="view_options">NSView</string>
-						<string key="view_privacy">NSView</string>
-						<string key="view_profile">NSView</string>
-						<string key="view_setup">NSView</string>
-					</dictionary>
-					<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
-						<object class="IBToOneOutletInfo" key="checkBox_checkMail">
-							<string key="name">checkBox_checkMail</string>
-							<string key="candidateClassName">NSButton</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="checkBox_sendTyping">
-							<string key="name">checkBox_sendTyping</string>
-							<string key="candidateClassName">NSButton</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="label_alias">
-							<string key="name">label_alias</string>
-							<string key="candidateClassName">NSTextField</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="label_encryption">
-							<string key="name">label_encryption</string>
-							<string key="candidateClassName">NSTextField</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="label_password">
-							<string key="name">label_password</string>
-							<string key="candidateClassName">NSTextField</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="label_port">
-							<string key="name">label_port</string>
-							<string key="candidateClassName">NSTextField</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="label_server">
-							<string key="name">label_server</string>
-							<string key="candidateClassName">NSTextField</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="label_typing">
-							<string key="name">label_typing</string>
-							<string key="candidateClassName">NSTextField</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="popUp_encryption">
-							<string key="name">popUp_encryption</string>
-							<string key="candidateClassName">NSPopUpButton</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="progressIndicator_registering">
-							<string key="name">progressIndicator_registering</string>
-							<string key="candidateClassName">NSProgressIndicator</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="textField_accountUID">
-							<string key="name">textField_accountUID</string>
-							<string key="candidateClassName">NSTextField</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="textField_accountUIDLabel">
-							<string key="name">textField_accountUIDLabel</string>
-							<string key="candidateClassName">NSTextField</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="textField_alias">
-							<string key="name">textField_alias</string>
-							<string key="candidateClassName">NSTextField</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="textField_connectHost">
-							<string key="name">textField_connectHost</string>
-							<string key="candidateClassName">NSTextField</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="textField_connectPort">
-							<string key="name">textField_connectPort</string>
-							<string key="candidateClassName">NSTextField</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="textField_password">
-							<string key="name">textField_password</string>
-							<string key="candidateClassName">NSTextField</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="textField_registering">
-							<string key="name">textField_registering</string>
-							<string key="candidateClassName">NSTextField</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="view_auxiliaryTabView">
-							<string key="name">view_auxiliaryTabView</string>
-							<string key="candidateClassName">NSTabView</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="view_options">
-							<string key="name">view_options</string>
-							<string key="candidateClassName">NSView</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="view_privacy">
-							<string key="name">view_privacy</string>
-							<string key="candidateClassName">NSView</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="view_profile">
-							<string key="name">view_profile</string>
-							<string key="candidateClassName">NSView</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="view_setup">
-							<string key="name">view_setup</string>
-							<string key="candidateClassName">NSView</string>
-						</object>
-					</dictionary>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">../Frameworks/Adium Framework/Source/AIAccountViewController.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">AIAccountViewController</string>
-					<object class="NSMutableDictionary" key="actions">
-						<string key="NS.key.0">changedPreference:</string>
-						<string key="NS.object.0">id</string>
-					</object>
-					<object class="NSMutableDictionary" key="actionInfosByName">
-						<string key="NS.key.0">changedPreference:</string>
-						<object class="IBActionInfo" key="NS.object.0">
-							<string key="name">changedPreference:</string>
-							<string key="candidateClassName">id</string>
-						</object>
-					</object>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">../Frameworks/Adium Framework/Source/AIAccountViewController.m</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">AILocalizationButton</string>
-					<string key="superclassName">NSButton</string>
-					<dictionary class="NSMutableDictionary" key="outlets">
-						<string key="view_anchorToLeftSide">NSView</string>
-						<string key="view_anchorToRightSide">NSView</string>
-						<string key="window_anchorOnLeftSide">NSWindow</string>
-						<string key="window_anchorOnRightSide">NSWindow</string>
-					</dictionary>
-					<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
-						<object class="IBToOneOutletInfo" key="view_anchorToLeftSide">
-							<string key="name">view_anchorToLeftSide</string>
-							<string key="candidateClassName">NSView</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="view_anchorToRightSide">
-							<string key="name">view_anchorToRightSide</string>
-							<string key="candidateClassName">NSView</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="window_anchorOnLeftSide">
-							<string key="name">window_anchorOnLeftSide</string>
-							<string key="candidateClassName">NSWindow</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="window_anchorOnRightSide">
-							<string key="name">window_anchorOnRightSide</string>
-							<string key="candidateClassName">NSWindow</string>
-						</object>
-					</dictionary>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">../Frameworks/Adium Framework/Source/AILocalizationButton.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">AILocalizationTextField</string>
-					<string key="superclassName">NSTextField</string>
-					<dictionary class="NSMutableDictionary" key="outlets">
-						<string key="view_anchorToLeftSide">NSView</string>
-						<string key="view_anchorToRightSide">NSView</string>
-						<string key="window_anchorOnLeftSide">NSWindow</string>
-						<string key="window_anchorOnRightSide">NSWindow</string>
-					</dictionary>
-					<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
-						<object class="IBToOneOutletInfo" key="view_anchorToLeftSide">
-							<string key="name">view_anchorToLeftSide</string>
-							<string key="candidateClassName">NSView</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="view_anchorToRightSide">
-							<string key="name">view_anchorToRightSide</string>
-							<string key="candidateClassName">NSView</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="window_anchorOnLeftSide">
-							<string key="name">window_anchorOnLeftSide</string>
-							<string key="candidateClassName">NSWindow</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="window_anchorOnRightSide">
-							<string key="name">window_anchorOnRightSide</string>
-							<string key="candidateClassName">NSWindow</string>
-						</object>
-					</dictionary>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">../Frameworks/Adium Framework/Source/AILocalizationTextField.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">AIPurpleGTalkAccountViewController</string>
-					<string key="superclassName">ESPurpleJabberAccountViewController</string>
-					<dictionary class="NSMutableDictionary" key="actions">
-						<string key="requestAccess:">id</string>
-						<string key="submit:">id</string>
-					</dictionary>
-					<dictionary class="NSMutableDictionary" key="actionInfosByName">
-						<object class="IBActionInfo" key="requestAccess:">
-							<string key="name">requestAccess:</string>
-							<string key="candidateClassName">id</string>
-						</object>
-						<object class="IBActionInfo" key="submit:">
-							<string key="name">submit:</string>
-							<string key="candidateClassName">id</string>
-						</object>
-					</dictionary>
-					<dictionary class="NSMutableDictionary" key="outlets">
-						<string key="button_submit">NSButton</string>
-						<string key="label_code">NSTextField</string>
-						<string key="label_grant">NSTextField</string>
-						<string key="textField_code">NSTextField</string>
-					</dictionary>
-					<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
-						<object class="IBToOneOutletInfo" key="button_submit">
-							<string key="name">button_submit</string>
-							<string key="candidateClassName">NSButton</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="label_code">
-							<string key="name">label_code</string>
-							<string key="candidateClassName">NSTextField</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="label_grant">
-							<string key="name">label_grant</string>
-							<string key="candidateClassName">NSTextField</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="textField_code">
-							<string key="name">textField_code</string>
-							<string key="candidateClassName">NSTextField</string>
-						</object>
-					</dictionary>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">../Plugins/Purple Service/AIPurpleGTalkAccountViewController.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">AIPurpleGTalkAccountViewController</string>
-					<dictionary class="NSMutableDictionary" key="actions">
-						<string key="requestAccess:">id</string>
-						<string key="submit:">id</string>
-					</dictionary>
-					<dictionary class="NSMutableDictionary" key="actionInfosByName">
-						<object class="IBActionInfo" key="requestAccess:">
-							<string key="name">requestAccess:</string>
-							<string key="candidateClassName">id</string>
-						</object>
-						<object class="IBActionInfo" key="submit:">
-							<string key="name">submit:</string>
-							<string key="candidateClassName">id</string>
-						</object>
-					</dictionary>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">../Plugins/Purple Service/AIPurpleGTalkAccountViewController.m</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">ESPurpleJabberAccountViewController</string>
-					<string key="superclassName">PurpleAccountViewController</string>
-					<dictionary class="NSMutableDictionary" key="actions">
-						<string key="registerCancel:">id</string>
-						<string key="registerNewAccount:">id</string>
-						<string key="registerRequestAccount:">id</string>
-						<string key="subscriptionModeDidChange:">id</string>
-						<string key="visitServerHomepage:">id</string>
-					</dictionary>
-					<dictionary class="NSMutableDictionary" key="actionInfosByName">
-						<object class="IBActionInfo" key="registerCancel:">
-							<string key="name">registerCancel:</string>
-							<string key="candidateClassName">id</string>
-						</object>
-						<object class="IBActionInfo" key="registerNewAccount:">
-							<string key="name">registerNewAccount:</string>
-							<string key="candidateClassName">id</string>
-						</object>
-						<object class="IBActionInfo" key="registerRequestAccount:">
-							<string key="name">registerRequestAccount:</string>
-							<string key="candidateClassName">id</string>
-						</object>
-						<object class="IBActionInfo" key="subscriptionModeDidChange:">
-							<string key="name">subscriptionModeDidChange:</string>
-							<string key="candidateClassName">id</string>
-						</object>
-						<object class="IBActionInfo" key="visitServerHomepage:">
-							<string key="name">visitServerHomepage:</string>
-							<string key="candidateClassName">id</string>
-						</object>
-					</dictionary>
-					<dictionary class="NSMutableDictionary" key="outlets">
-						<string key="button_register">NSButton</string>
-						<string key="button_serverHomepage">NSButton</string>
-						<string key="checkBox_allowPlaintext">NSButton</string>
-						<string key="checkBox_checkCertificates">NSButton</string>
-						<string key="checkBox_forceOldSSL">NSButton</string>
-						<string key="checkBox_requireTLS">NSButton</string>
-						<string key="checkBox_useTLS">NSButton</string>
-						<string key="comboBox_subscriptionGroup">NSComboBox</string>
-						<string key="popup_subscriptionBehavior">NSPopUpButton</string>
-						<string key="tableview_servers">NSTableView</string>
-						<string key="textField_BOSHserver">NSTextField</string>
-						<string key="textField_connectServer">NSTextField</string>
-						<string key="textField_ftProxies">NSTextField</string>
-						<string key="textField_priorityAvailable">NSTextField</string>
-						<string key="textField_priorityAway">NSTextField</string>
-						<string key="textField_registerServerName">NSTextField</string>
-						<string key="textField_registerServerPort">NSTextField</string>
-						<string key="textField_resource">NSTextField</string>
-						<string key="textField_subscriptionModeLabel">NSTextField</string>
-						<string key="textView_serverDescription">NSTextView</string>
-						<string key="window_registerServer">NSPanel</string>
-					</dictionary>
-					<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
-						<object class="IBToOneOutletInfo" key="button_register">
-							<string key="name">button_register</string>
-							<string key="candidateClassName">NSButton</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="button_serverHomepage">
-							<string key="name">button_serverHomepage</string>
-							<string key="candidateClassName">NSButton</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="checkBox_allowPlaintext">
-							<string key="name">checkBox_allowPlaintext</string>
-							<string key="candidateClassName">NSButton</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="checkBox_checkCertificates">
-							<string key="name">checkBox_checkCertificates</string>
-							<string key="candidateClassName">NSButton</string>
-						</object>
-						<object class="IBToOneOutletInfo" key="checkBox_forceOldSSL">
-							<string key="name">checkBox_forceOldSSL</string>
-							<string key="candidateClassName">NSButton</string>




More information about the commits mailing list