Statistics
| Branch: | Tag: | Revision:

root / Classes / ASIAuthenticationDialog.m @ 9fee07a6

History | View | Annotate | Download (15.4 kB)

1 700184fb Miltiadis Vasilakis
//
2 700184fb Miltiadis Vasilakis
//  ASIAuthenticationDialog.m
3 700184fb Miltiadis Vasilakis
//  Part of ASIHTTPRequest -> http://allseeing-i.com/ASIHTTPRequest
4 700184fb Miltiadis Vasilakis
//
5 700184fb Miltiadis Vasilakis
//  Created by Ben Copsey on 21/08/2009.
6 700184fb Miltiadis Vasilakis
//  Copyright 2009 All-Seeing Interactive. All rights reserved.
7 700184fb Miltiadis Vasilakis
//
8 700184fb Miltiadis Vasilakis
9 700184fb Miltiadis Vasilakis
#import "ASIAuthenticationDialog.h"
10 700184fb Miltiadis Vasilakis
#import "ASIHTTPRequest.h"
11 700184fb Miltiadis Vasilakis
#import <QuartzCore/QuartzCore.h>
12 700184fb Miltiadis Vasilakis
13 700184fb Miltiadis Vasilakis
static ASIAuthenticationDialog *sharedDialog = nil;
14 700184fb Miltiadis Vasilakis
BOOL isDismissing = NO;
15 700184fb Miltiadis Vasilakis
static NSMutableArray *requestsNeedingAuthentication = nil;
16 700184fb Miltiadis Vasilakis
17 700184fb Miltiadis Vasilakis
static const NSUInteger kUsernameRow = 0;
18 700184fb Miltiadis Vasilakis
static const NSUInteger kUsernameSection = 0;
19 700184fb Miltiadis Vasilakis
static const NSUInteger kPasswordRow = 1;
20 700184fb Miltiadis Vasilakis
static const NSUInteger kPasswordSection = 0;
21 700184fb Miltiadis Vasilakis
static const NSUInteger kDomainRow = 0;
22 700184fb Miltiadis Vasilakis
static const NSUInteger kDomainSection = 1;
23 700184fb Miltiadis Vasilakis
24 700184fb Miltiadis Vasilakis
25 700184fb Miltiadis Vasilakis
@implementation ASIAutorotatingViewController
26 700184fb Miltiadis Vasilakis
27 700184fb Miltiadis Vasilakis
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
28 700184fb Miltiadis Vasilakis
{
29 700184fb Miltiadis Vasilakis
	return YES;
30 700184fb Miltiadis Vasilakis
}
31 700184fb Miltiadis Vasilakis
32 700184fb Miltiadis Vasilakis
@end
33 700184fb Miltiadis Vasilakis
34 700184fb Miltiadis Vasilakis
35 700184fb Miltiadis Vasilakis
@interface ASIAuthenticationDialog ()
36 700184fb Miltiadis Vasilakis
- (void)showTitle;
37 700184fb Miltiadis Vasilakis
- (void)show;
38 700184fb Miltiadis Vasilakis
- (NSArray *)requestsRequiringTheseCredentials;
39 700184fb Miltiadis Vasilakis
- (void)presentNextDialog;
40 700184fb Miltiadis Vasilakis
- (void)keyboardWillShow:(NSNotification *)notification;
41 700184fb Miltiadis Vasilakis
- (void)orientationChanged:(NSNotification *)notification;
42 700184fb Miltiadis Vasilakis
- (void)cancelAuthenticationFromDialog:(id)sender;
43 700184fb Miltiadis Vasilakis
- (void)loginWithCredentialsFromDialog:(id)sender;
44 700184fb Miltiadis Vasilakis
@property (retain) UITableView *tableView;
45 700184fb Miltiadis Vasilakis
@end
46 700184fb Miltiadis Vasilakis
47 700184fb Miltiadis Vasilakis
@implementation ASIAuthenticationDialog
48 700184fb Miltiadis Vasilakis
49 700184fb Miltiadis Vasilakis
#pragma mark init / dealloc
50 700184fb Miltiadis Vasilakis
51 700184fb Miltiadis Vasilakis
+ (void)initialize
52 700184fb Miltiadis Vasilakis
{
53 700184fb Miltiadis Vasilakis
	if (self == [ASIAuthenticationDialog class]) {
54 700184fb Miltiadis Vasilakis
		requestsNeedingAuthentication = [[NSMutableArray array] retain];
55 700184fb Miltiadis Vasilakis
	}
56 700184fb Miltiadis Vasilakis
}
57 700184fb Miltiadis Vasilakis
58 700184fb Miltiadis Vasilakis
+ (void)presentAuthenticationDialogForRequest:(ASIHTTPRequest *)theRequest
59 700184fb Miltiadis Vasilakis
{
60 700184fb Miltiadis Vasilakis
	// No need for a lock here, this will always be called on the main thread
61 700184fb Miltiadis Vasilakis
	if (!sharedDialog) {
62 700184fb Miltiadis Vasilakis
		sharedDialog = [[self alloc] init];
63 700184fb Miltiadis Vasilakis
		[sharedDialog setRequest:theRequest];
64 700184fb Miltiadis Vasilakis
		if ([theRequest authenticationNeeded] == ASIProxyAuthenticationNeeded) {
65 700184fb Miltiadis Vasilakis
			[sharedDialog setType:ASIProxyAuthenticationType];
66 700184fb Miltiadis Vasilakis
		} else {
67 700184fb Miltiadis Vasilakis
			[sharedDialog setType:ASIStandardAuthenticationType];
68 700184fb Miltiadis Vasilakis
		}
69 700184fb Miltiadis Vasilakis
		[sharedDialog show];
70 700184fb Miltiadis Vasilakis
	} else {
71 700184fb Miltiadis Vasilakis
		[requestsNeedingAuthentication addObject:theRequest];
72 700184fb Miltiadis Vasilakis
	}
73 700184fb Miltiadis Vasilakis
}
74 700184fb Miltiadis Vasilakis
75 700184fb Miltiadis Vasilakis
- (id)init
76 700184fb Miltiadis Vasilakis
{
77 700184fb Miltiadis Vasilakis
	if ((self = [self initWithNibName:nil bundle:nil])) {
78 700184fb Miltiadis Vasilakis
		[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
79 700184fb Miltiadis Vasilakis
80 700184fb Miltiadis Vasilakis
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
81 700184fb Miltiadis Vasilakis
		if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
82 700184fb Miltiadis Vasilakis
#endif
83 700184fb Miltiadis Vasilakis
			if (![UIDevice currentDevice].generatesDeviceOrientationNotifications) {
84 700184fb Miltiadis Vasilakis
				[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
85 700184fb Miltiadis Vasilakis
				[self setDidEnableRotationNotifications:YES];
86 700184fb Miltiadis Vasilakis
			}
87 700184fb Miltiadis Vasilakis
			[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
88 700184fb Miltiadis Vasilakis
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
89 700184fb Miltiadis Vasilakis
		}
90 700184fb Miltiadis Vasilakis
#endif
91 700184fb Miltiadis Vasilakis
	}
92 700184fb Miltiadis Vasilakis
	return self;
93 700184fb Miltiadis Vasilakis
}
94 700184fb Miltiadis Vasilakis
95 700184fb Miltiadis Vasilakis
- (void)dealloc
96 700184fb Miltiadis Vasilakis
{
97 700184fb Miltiadis Vasilakis
	if ([self didEnableRotationNotifications]) {
98 700184fb Miltiadis Vasilakis
		[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
99 700184fb Miltiadis Vasilakis
	}
100 700184fb Miltiadis Vasilakis
	[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
101 700184fb Miltiadis Vasilakis
102 700184fb Miltiadis Vasilakis
	[request release];
103 700184fb Miltiadis Vasilakis
	[tableView release];
104 700184fb Miltiadis Vasilakis
	[presentingController.view removeFromSuperview];
105 700184fb Miltiadis Vasilakis
	[presentingController release];
106 700184fb Miltiadis Vasilakis
	[super dealloc];
107 700184fb Miltiadis Vasilakis
}
108 700184fb Miltiadis Vasilakis
109 700184fb Miltiadis Vasilakis
#pragma mark keyboard notifications
110 700184fb Miltiadis Vasilakis
111 700184fb Miltiadis Vasilakis
- (void)keyboardWillShow:(NSNotification *)notification
112 700184fb Miltiadis Vasilakis
{
113 700184fb Miltiadis Vasilakis
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
114 700184fb Miltiadis Vasilakis
	if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
115 700184fb Miltiadis Vasilakis
#endif
116 700184fb Miltiadis Vasilakis
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_3_2
117 700184fb Miltiadis Vasilakis
		NSValue *keyboardBoundsValue = [[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey];
118 700184fb Miltiadis Vasilakis
#else
119 700184fb Miltiadis Vasilakis
		NSValue *keyboardBoundsValue = [[notification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey];
120 700184fb Miltiadis Vasilakis
#endif
121 700184fb Miltiadis Vasilakis
		CGRect keyboardBounds;
122 700184fb Miltiadis Vasilakis
		[keyboardBoundsValue getValue:&keyboardBounds];
123 700184fb Miltiadis Vasilakis
		UIEdgeInsets e = UIEdgeInsetsMake(0, 0, keyboardBounds.size.height, 0);
124 700184fb Miltiadis Vasilakis
		[[self tableView] setScrollIndicatorInsets:e];
125 700184fb Miltiadis Vasilakis
		[[self tableView] setContentInset:e];
126 700184fb Miltiadis Vasilakis
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
127 700184fb Miltiadis Vasilakis
	}
128 700184fb Miltiadis Vasilakis
#endif
129 700184fb Miltiadis Vasilakis
}
130 700184fb Miltiadis Vasilakis
131 700184fb Miltiadis Vasilakis
// Manually handles orientation changes on iPhone
132 700184fb Miltiadis Vasilakis
- (void)orientationChanged:(NSNotification *)notification
133 700184fb Miltiadis Vasilakis
{
134 700184fb Miltiadis Vasilakis
	[self showTitle];
135 700184fb Miltiadis Vasilakis
	
136 7db1712d Miltiadis Vasilakis
	UIDeviceOrientation o = [[UIDevice currentDevice] orientation];
137 700184fb Miltiadis Vasilakis
	CGFloat angle = 0;
138 700184fb Miltiadis Vasilakis
	switch (o) {
139 700184fb Miltiadis Vasilakis
		case UIDeviceOrientationLandscapeLeft: angle = 90; break;
140 700184fb Miltiadis Vasilakis
		case UIDeviceOrientationLandscapeRight: angle = -90; break;
141 700184fb Miltiadis Vasilakis
		case UIDeviceOrientationPortraitUpsideDown: angle = 180; break;
142 700184fb Miltiadis Vasilakis
		default: break;
143 700184fb Miltiadis Vasilakis
	}
144 700184fb Miltiadis Vasilakis
145 700184fb Miltiadis Vasilakis
	CGRect f = [[UIScreen mainScreen] applicationFrame];
146 700184fb Miltiadis Vasilakis
147 700184fb Miltiadis Vasilakis
	// Swap the frame height and width if necessary
148 700184fb Miltiadis Vasilakis
 	if (UIDeviceOrientationIsLandscape(o)) {
149 700184fb Miltiadis Vasilakis
		CGFloat t;
150 700184fb Miltiadis Vasilakis
		t = f.size.width;
151 700184fb Miltiadis Vasilakis
		f.size.width = f.size.height;
152 700184fb Miltiadis Vasilakis
		f.size.height = t;
153 700184fb Miltiadis Vasilakis
	}
154 700184fb Miltiadis Vasilakis
155 700184fb Miltiadis Vasilakis
	CGAffineTransform previousTransform = self.view.layer.affineTransform;
156 700184fb Miltiadis Vasilakis
	CGAffineTransform newTransform = CGAffineTransformMakeRotation((CGFloat)(angle * M_PI / 180.0));
157 700184fb Miltiadis Vasilakis
158 700184fb Miltiadis Vasilakis
	// Reset the transform so we can set the size
159 700184fb Miltiadis Vasilakis
	self.view.layer.affineTransform = CGAffineTransformIdentity;
160 700184fb Miltiadis Vasilakis
	self.view.frame = (CGRect){ { 0, 0 }, f.size};
161 700184fb Miltiadis Vasilakis
162 700184fb Miltiadis Vasilakis
	// Revert to the previous transform for correct animation
163 700184fb Miltiadis Vasilakis
	self.view.layer.affineTransform = previousTransform;
164 700184fb Miltiadis Vasilakis
165 700184fb Miltiadis Vasilakis
	[UIView beginAnimations:nil context:NULL];
166 700184fb Miltiadis Vasilakis
	[UIView setAnimationDuration:0.3];
167 700184fb Miltiadis Vasilakis
168 700184fb Miltiadis Vasilakis
	// Set the new transform
169 700184fb Miltiadis Vasilakis
	self.view.layer.affineTransform = newTransform;
170 700184fb Miltiadis Vasilakis
171 700184fb Miltiadis Vasilakis
	// Fix the view origin
172 700184fb Miltiadis Vasilakis
	self.view.frame = (CGRect){ { f.origin.x, f.origin.y },self.view.frame.size};
173 700184fb Miltiadis Vasilakis
    [UIView commitAnimations];
174 700184fb Miltiadis Vasilakis
}
175 700184fb Miltiadis Vasilakis
		 
176 700184fb Miltiadis Vasilakis
#pragma mark utilities
177 700184fb Miltiadis Vasilakis
178 700184fb Miltiadis Vasilakis
- (UIViewController *)presentingController
179 700184fb Miltiadis Vasilakis
{
180 700184fb Miltiadis Vasilakis
	if (!presentingController) {
181 700184fb Miltiadis Vasilakis
		presentingController = [[ASIAutorotatingViewController alloc] initWithNibName:nil bundle:nil];
182 700184fb Miltiadis Vasilakis
183 700184fb Miltiadis Vasilakis
		// Attach to the window, but don't interfere.
184 700184fb Miltiadis Vasilakis
		UIWindow *window = [[[UIApplication sharedApplication] windows] objectAtIndex:0];
185 700184fb Miltiadis Vasilakis
		[window addSubview:[presentingController view]];
186 700184fb Miltiadis Vasilakis
		[[presentingController view] setFrame:CGRectZero];
187 700184fb Miltiadis Vasilakis
		[[presentingController view] setUserInteractionEnabled:NO];
188 700184fb Miltiadis Vasilakis
	}
189 700184fb Miltiadis Vasilakis
190 700184fb Miltiadis Vasilakis
	return presentingController;
191 700184fb Miltiadis Vasilakis
}
192 700184fb Miltiadis Vasilakis
193 700184fb Miltiadis Vasilakis
- (UITextField *)textFieldInRow:(NSUInteger)row section:(NSUInteger)section
194 700184fb Miltiadis Vasilakis
{
195 700184fb Miltiadis Vasilakis
	return [[[[[self tableView] cellForRowAtIndexPath:
196 700184fb Miltiadis Vasilakis
			   [NSIndexPath indexPathForRow:row inSection:section]]
197 700184fb Miltiadis Vasilakis
			  contentView] subviews] objectAtIndex:0];
198 700184fb Miltiadis Vasilakis
}
199 700184fb Miltiadis Vasilakis
200 700184fb Miltiadis Vasilakis
- (UITextField *)usernameField
201 700184fb Miltiadis Vasilakis
{
202 700184fb Miltiadis Vasilakis
	return [self textFieldInRow:kUsernameRow section:kUsernameSection];
203 700184fb Miltiadis Vasilakis
}
204 700184fb Miltiadis Vasilakis
205 700184fb Miltiadis Vasilakis
- (UITextField *)passwordField
206 700184fb Miltiadis Vasilakis
{
207 700184fb Miltiadis Vasilakis
	return [self textFieldInRow:kPasswordRow section:kPasswordSection];
208 700184fb Miltiadis Vasilakis
}
209 700184fb Miltiadis Vasilakis
210 700184fb Miltiadis Vasilakis
- (UITextField *)domainField
211 700184fb Miltiadis Vasilakis
{
212 700184fb Miltiadis Vasilakis
	return [self textFieldInRow:kDomainRow section:kDomainSection];
213 700184fb Miltiadis Vasilakis
}
214 700184fb Miltiadis Vasilakis
215 700184fb Miltiadis Vasilakis
#pragma mark show / dismiss
216 700184fb Miltiadis Vasilakis
217 700184fb Miltiadis Vasilakis
+ (void)dismiss
218 700184fb Miltiadis Vasilakis
{
219 700184fb Miltiadis Vasilakis
	[[sharedDialog parentViewController] dismissModalViewControllerAnimated:YES];
220 700184fb Miltiadis Vasilakis
}
221 700184fb Miltiadis Vasilakis
222 700184fb Miltiadis Vasilakis
- (void)viewDidDisappear:(BOOL)animated
223 700184fb Miltiadis Vasilakis
{
224 700184fb Miltiadis Vasilakis
	[self retain];
225 700184fb Miltiadis Vasilakis
	[sharedDialog release];
226 700184fb Miltiadis Vasilakis
	sharedDialog = nil;
227 700184fb Miltiadis Vasilakis
	[self presentNextDialog];
228 700184fb Miltiadis Vasilakis
	[self release];
229 700184fb Miltiadis Vasilakis
}
230 700184fb Miltiadis Vasilakis
231 700184fb Miltiadis Vasilakis
- (void)dismiss
232 700184fb Miltiadis Vasilakis
{
233 700184fb Miltiadis Vasilakis
	if (self == sharedDialog) {
234 700184fb Miltiadis Vasilakis
		[[self class] dismiss];
235 700184fb Miltiadis Vasilakis
	} else {
236 700184fb Miltiadis Vasilakis
		[[self parentViewController] dismissModalViewControllerAnimated:YES];
237 700184fb Miltiadis Vasilakis
	}
238 700184fb Miltiadis Vasilakis
}
239 700184fb Miltiadis Vasilakis
240 700184fb Miltiadis Vasilakis
- (void)showTitle
241 700184fb Miltiadis Vasilakis
{
242 700184fb Miltiadis Vasilakis
	UINavigationBar *navigationBar = [[[self view] subviews] objectAtIndex:0];
243 700184fb Miltiadis Vasilakis
	UINavigationItem *navItem = [[navigationBar items] objectAtIndex:0];
244 700184fb Miltiadis Vasilakis
	if (UIInterfaceOrientationIsPortrait([[UIDevice currentDevice] orientation])) {
245 700184fb Miltiadis Vasilakis
		// Setup the title
246 700184fb Miltiadis Vasilakis
		if ([self type] == ASIProxyAuthenticationType) {
247 700184fb Miltiadis Vasilakis
			[navItem setPrompt:@"Login to this secure proxy server."];
248 700184fb Miltiadis Vasilakis
		} else {
249 700184fb Miltiadis Vasilakis
			[navItem setPrompt:@"Login to this secure server."];
250 700184fb Miltiadis Vasilakis
		}
251 700184fb Miltiadis Vasilakis
	} else {
252 700184fb Miltiadis Vasilakis
		[navItem setPrompt:nil];
253 700184fb Miltiadis Vasilakis
	}
254 700184fb Miltiadis Vasilakis
	[navigationBar sizeToFit];
255 700184fb Miltiadis Vasilakis
	CGRect f = [[self view] bounds];
256 700184fb Miltiadis Vasilakis
	f.origin.y = [navigationBar frame].size.height;
257 700184fb Miltiadis Vasilakis
	f.size.height -= f.origin.y;
258 700184fb Miltiadis Vasilakis
	[[self tableView] setFrame:f];
259 700184fb Miltiadis Vasilakis
}
260 700184fb Miltiadis Vasilakis
261 700184fb Miltiadis Vasilakis
- (void)show
262 700184fb Miltiadis Vasilakis
{
263 700184fb Miltiadis Vasilakis
	// Remove all subviews
264 700184fb Miltiadis Vasilakis
	UIView *v;
265 700184fb Miltiadis Vasilakis
	while ((v = [[[self view] subviews] lastObject])) {
266 700184fb Miltiadis Vasilakis
		[v removeFromSuperview];
267 700184fb Miltiadis Vasilakis
	}
268 700184fb Miltiadis Vasilakis
269 700184fb Miltiadis Vasilakis
	// Setup toolbar
270 700184fb Miltiadis Vasilakis
	UINavigationBar *bar = [[[UINavigationBar alloc] init] autorelease];
271 700184fb Miltiadis Vasilakis
	[bar setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
272 700184fb Miltiadis Vasilakis
273 700184fb Miltiadis Vasilakis
	UINavigationItem *navItem = [[[UINavigationItem alloc] init] autorelease];
274 700184fb Miltiadis Vasilakis
	bar.items = [NSArray arrayWithObject:navItem];
275 700184fb Miltiadis Vasilakis
276 700184fb Miltiadis Vasilakis
	[[self view] addSubview:bar];
277 700184fb Miltiadis Vasilakis
278 700184fb Miltiadis Vasilakis
	[self showTitle];
279 700184fb Miltiadis Vasilakis
280 700184fb Miltiadis Vasilakis
	// Setup toolbar buttons
281 700184fb Miltiadis Vasilakis
	if ([self type] == ASIProxyAuthenticationType) {
282 700184fb Miltiadis Vasilakis
		[navItem setTitle:[[self request] proxyHost]];
283 700184fb Miltiadis Vasilakis
	} else {
284 700184fb Miltiadis Vasilakis
		[navItem setTitle:[[[self request] url] host]];
285 700184fb Miltiadis Vasilakis
	}
286 700184fb Miltiadis Vasilakis
287 700184fb Miltiadis Vasilakis
	[navItem setLeftBarButtonItem:[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelAuthenticationFromDialog:)] autorelease]];
288 700184fb Miltiadis Vasilakis
	[navItem setRightBarButtonItem:[[[UIBarButtonItem alloc] initWithTitle:@"Login" style:UIBarButtonItemStyleDone target:self action:@selector(loginWithCredentialsFromDialog:)] autorelease]];
289 700184fb Miltiadis Vasilakis
290 700184fb Miltiadis Vasilakis
	// We show the login form in a table view, similar to Safari's authentication dialog
291 700184fb Miltiadis Vasilakis
	[bar sizeToFit];
292 700184fb Miltiadis Vasilakis
	CGRect f = [[self view] bounds];
293 700184fb Miltiadis Vasilakis
	f.origin.y = [bar frame].size.height;
294 700184fb Miltiadis Vasilakis
	f.size.height -= f.origin.y;
295 700184fb Miltiadis Vasilakis
296 700184fb Miltiadis Vasilakis
	[self setTableView:[[[UITableView alloc] initWithFrame:f style:UITableViewStyleGrouped] autorelease]];
297 700184fb Miltiadis Vasilakis
	[[self tableView] setDelegate:self];
298 700184fb Miltiadis Vasilakis
	[[self tableView] setDataSource:self];
299 700184fb Miltiadis Vasilakis
	[[self tableView] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
300 700184fb Miltiadis Vasilakis
	[[self view] addSubview:[self tableView]];
301 700184fb Miltiadis Vasilakis
302 700184fb Miltiadis Vasilakis
	// Force reload the table content, and focus the first field to show the keyboard
303 700184fb Miltiadis Vasilakis
	[[self tableView] reloadData];
304 700184fb Miltiadis Vasilakis
	[[[[[self tableView] cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]].contentView subviews] objectAtIndex:0] becomeFirstResponder];
305 700184fb Miltiadis Vasilakis
306 700184fb Miltiadis Vasilakis
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
307 700184fb Miltiadis Vasilakis
	if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
308 700184fb Miltiadis Vasilakis
		[self setModalPresentationStyle:UIModalPresentationFormSheet];
309 700184fb Miltiadis Vasilakis
	}
310 700184fb Miltiadis Vasilakis
#endif
311 700184fb Miltiadis Vasilakis
312 700184fb Miltiadis Vasilakis
	[[self presentingController] presentModalViewController:self animated:YES];
313 700184fb Miltiadis Vasilakis
}
314 700184fb Miltiadis Vasilakis
315 700184fb Miltiadis Vasilakis
#pragma mark button callbacks
316 700184fb Miltiadis Vasilakis
317 700184fb Miltiadis Vasilakis
- (void)cancelAuthenticationFromDialog:(id)sender
318 700184fb Miltiadis Vasilakis
{
319 700184fb Miltiadis Vasilakis
	for (ASIHTTPRequest *theRequest in [self requestsRequiringTheseCredentials]) {
320 700184fb Miltiadis Vasilakis
		[theRequest cancelAuthentication];
321 700184fb Miltiadis Vasilakis
		[requestsNeedingAuthentication removeObject:theRequest];
322 700184fb Miltiadis Vasilakis
	}
323 700184fb Miltiadis Vasilakis
	[self dismiss];
324 700184fb Miltiadis Vasilakis
}
325 700184fb Miltiadis Vasilakis
326 700184fb Miltiadis Vasilakis
- (NSArray *)requestsRequiringTheseCredentials
327 700184fb Miltiadis Vasilakis
{
328 700184fb Miltiadis Vasilakis
	NSMutableArray *requestsRequiringTheseCredentials = [NSMutableArray array];
329 700184fb Miltiadis Vasilakis
	NSURL *requestURL = [[self request] url];
330 700184fb Miltiadis Vasilakis
	for (ASIHTTPRequest *otherRequest in requestsNeedingAuthentication) {
331 700184fb Miltiadis Vasilakis
		NSURL *theURL = [otherRequest url];
332 700184fb Miltiadis Vasilakis
		if (([otherRequest authenticationNeeded] == [[self request] authenticationNeeded]) && [[theURL host] isEqualToString:[requestURL host]] && ([theURL port] == [requestURL port] || ([requestURL port] && [[theURL port] isEqualToNumber:[requestURL port]])) && [[theURL scheme] isEqualToString:[requestURL scheme]] && ((![otherRequest authenticationRealm] && ![[self request] authenticationRealm]) || ([otherRequest authenticationRealm] && [[self request] authenticationRealm] && [[[self request] authenticationRealm] isEqualToString:[otherRequest authenticationRealm]]))) {
333 700184fb Miltiadis Vasilakis
			[requestsRequiringTheseCredentials addObject:otherRequest];
334 700184fb Miltiadis Vasilakis
		}
335 700184fb Miltiadis Vasilakis
	}
336 700184fb Miltiadis Vasilakis
	[requestsRequiringTheseCredentials addObject:[self request]];
337 700184fb Miltiadis Vasilakis
	return requestsRequiringTheseCredentials;
338 700184fb Miltiadis Vasilakis
}
339 700184fb Miltiadis Vasilakis
340 700184fb Miltiadis Vasilakis
- (void)presentNextDialog
341 700184fb Miltiadis Vasilakis
{
342 700184fb Miltiadis Vasilakis
	if ([requestsNeedingAuthentication count]) {
343 700184fb Miltiadis Vasilakis
		ASIHTTPRequest *nextRequest = [requestsNeedingAuthentication objectAtIndex:0];
344 700184fb Miltiadis Vasilakis
		[requestsNeedingAuthentication removeObjectAtIndex:0];
345 700184fb Miltiadis Vasilakis
		[[self class] presentAuthenticationDialogForRequest:nextRequest];
346 700184fb Miltiadis Vasilakis
	}
347 700184fb Miltiadis Vasilakis
}
348 700184fb Miltiadis Vasilakis
349 700184fb Miltiadis Vasilakis
350 700184fb Miltiadis Vasilakis
- (void)loginWithCredentialsFromDialog:(id)sender
351 700184fb Miltiadis Vasilakis
{
352 700184fb Miltiadis Vasilakis
	for (ASIHTTPRequest *theRequest in [self requestsRequiringTheseCredentials]) {
353 700184fb Miltiadis Vasilakis
354 700184fb Miltiadis Vasilakis
		NSString *username = [[self usernameField] text];
355 700184fb Miltiadis Vasilakis
		NSString *password = [[self passwordField] text];
356 700184fb Miltiadis Vasilakis
357 700184fb Miltiadis Vasilakis
		if (username == nil) { username = @""; }
358 700184fb Miltiadis Vasilakis
		if (password == nil) { password = @""; }
359 700184fb Miltiadis Vasilakis
360 700184fb Miltiadis Vasilakis
		if ([self type] == ASIProxyAuthenticationType) {
361 700184fb Miltiadis Vasilakis
			[theRequest setProxyUsername:username];
362 700184fb Miltiadis Vasilakis
			[theRequest setProxyPassword:password];
363 700184fb Miltiadis Vasilakis
		} else {
364 700184fb Miltiadis Vasilakis
			[theRequest setUsername:username];
365 700184fb Miltiadis Vasilakis
			[theRequest setPassword:password];
366 700184fb Miltiadis Vasilakis
		}
367 700184fb Miltiadis Vasilakis
368 700184fb Miltiadis Vasilakis
		// Handle NTLM domains
369 700184fb Miltiadis Vasilakis
		NSString *scheme = ([self type] == ASIStandardAuthenticationType) ? [[self request] authenticationScheme] : [[self request] proxyAuthenticationScheme];
370 700184fb Miltiadis Vasilakis
		if ([scheme isEqualToString:(NSString *)kCFHTTPAuthenticationSchemeNTLM]) {
371 700184fb Miltiadis Vasilakis
			NSString *domain = [[self domainField] text];
372 700184fb Miltiadis Vasilakis
			if ([self type] == ASIProxyAuthenticationType) {
373 700184fb Miltiadis Vasilakis
				[theRequest setProxyDomain:domain];
374 700184fb Miltiadis Vasilakis
			} else {
375 700184fb Miltiadis Vasilakis
				[theRequest setDomain:domain];
376 700184fb Miltiadis Vasilakis
			}
377 700184fb Miltiadis Vasilakis
		}
378 700184fb Miltiadis Vasilakis
379 700184fb Miltiadis Vasilakis
		[theRequest retryUsingSuppliedCredentials];
380 700184fb Miltiadis Vasilakis
		[requestsNeedingAuthentication removeObject:theRequest];
381 700184fb Miltiadis Vasilakis
	}
382 700184fb Miltiadis Vasilakis
	[self dismiss];
383 700184fb Miltiadis Vasilakis
}
384 700184fb Miltiadis Vasilakis
385 700184fb Miltiadis Vasilakis
#pragma mark table view data source
386 700184fb Miltiadis Vasilakis
387 700184fb Miltiadis Vasilakis
- (NSInteger)numberOfSectionsInTableView:(UITableView *)aTableView
388 700184fb Miltiadis Vasilakis
{
389 700184fb Miltiadis Vasilakis
	NSString *scheme = ([self type] == ASIStandardAuthenticationType) ? [[self request] authenticationScheme] : [[self request] proxyAuthenticationScheme];
390 700184fb Miltiadis Vasilakis
	if ([scheme isEqualToString:(NSString *)kCFHTTPAuthenticationSchemeNTLM]) {
391 700184fb Miltiadis Vasilakis
		return 2;
392 700184fb Miltiadis Vasilakis
	}
393 700184fb Miltiadis Vasilakis
	return 1;
394 700184fb Miltiadis Vasilakis
}
395 700184fb Miltiadis Vasilakis
396 700184fb Miltiadis Vasilakis
- (CGFloat)tableView:(UITableView *)aTableView heightForFooterInSection:(NSInteger)section
397 700184fb Miltiadis Vasilakis
{
398 700184fb Miltiadis Vasilakis
	if (section == [self numberOfSectionsInTableView:aTableView]-1) {
399 700184fb Miltiadis Vasilakis
		return 30;
400 700184fb Miltiadis Vasilakis
	}
401 700184fb Miltiadis Vasilakis
	return 0;
402 700184fb Miltiadis Vasilakis
}
403 700184fb Miltiadis Vasilakis
404 700184fb Miltiadis Vasilakis
- (CGFloat)tableView:(UITableView *)aTableView heightForHeaderInSection:(NSInteger)section
405 700184fb Miltiadis Vasilakis
{
406 700184fb Miltiadis Vasilakis
	if (section == 0) {
407 700184fb Miltiadis Vasilakis
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
408 700184fb Miltiadis Vasilakis
		if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
409 700184fb Miltiadis Vasilakis
			return 54;
410 700184fb Miltiadis Vasilakis
		}
411 700184fb Miltiadis Vasilakis
#endif
412 700184fb Miltiadis Vasilakis
		return 30;
413 700184fb Miltiadis Vasilakis
	}
414 700184fb Miltiadis Vasilakis
	return 0;
415 700184fb Miltiadis Vasilakis
}
416 700184fb Miltiadis Vasilakis
417 700184fb Miltiadis Vasilakis
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
418 700184fb Miltiadis Vasilakis
{
419 700184fb Miltiadis Vasilakis
	if (section == 0) {
420 700184fb Miltiadis Vasilakis
		return [[self request] authenticationRealm];
421 700184fb Miltiadis Vasilakis
	}
422 700184fb Miltiadis Vasilakis
	return nil;
423 700184fb Miltiadis Vasilakis
}
424 700184fb Miltiadis Vasilakis
425 700184fb Miltiadis Vasilakis
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
426 700184fb Miltiadis Vasilakis
{
427 700184fb Miltiadis Vasilakis
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_3_0
428 700184fb Miltiadis Vasilakis
	UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];
429 700184fb Miltiadis Vasilakis
#else
430 700184fb Miltiadis Vasilakis
	UITableViewCell *cell = [[[UITableViewCell alloc] initWithFrame:CGRectMake(0,0,0,0) reuseIdentifier:nil] autorelease];
431 700184fb Miltiadis Vasilakis
#endif
432 700184fb Miltiadis Vasilakis
433 700184fb Miltiadis Vasilakis
	[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
434 700184fb Miltiadis Vasilakis
435 700184fb Miltiadis Vasilakis
	CGRect f = CGRectInset([cell bounds], 10, 10);
436 700184fb Miltiadis Vasilakis
	UITextField *textField = [[[UITextField alloc] initWithFrame:f] autorelease];
437 700184fb Miltiadis Vasilakis
	[textField setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
438 700184fb Miltiadis Vasilakis
	[textField setAutocapitalizationType:UITextAutocapitalizationTypeNone];
439 700184fb Miltiadis Vasilakis
	[textField setAutocorrectionType:UITextAutocorrectionTypeNo];
440 700184fb Miltiadis Vasilakis
441 700184fb Miltiadis Vasilakis
	NSUInteger s = [indexPath section];
442 700184fb Miltiadis Vasilakis
	NSUInteger r = [indexPath row];
443 700184fb Miltiadis Vasilakis
444 700184fb Miltiadis Vasilakis
	if (s == kUsernameSection && r == kUsernameRow) {
445 700184fb Miltiadis Vasilakis
		[textField setPlaceholder:@"User"];
446 700184fb Miltiadis Vasilakis
	} else if (s == kPasswordSection && r == kPasswordRow) {
447 700184fb Miltiadis Vasilakis
		[textField setPlaceholder:@"Password"];
448 700184fb Miltiadis Vasilakis
		[textField setSecureTextEntry:YES];
449 700184fb Miltiadis Vasilakis
	} else if (s == kDomainSection && r == kDomainRow) {
450 700184fb Miltiadis Vasilakis
		[textField setPlaceholder:@"Domain"];
451 700184fb Miltiadis Vasilakis
	}
452 700184fb Miltiadis Vasilakis
	[cell.contentView addSubview:textField];
453 700184fb Miltiadis Vasilakis
454 700184fb Miltiadis Vasilakis
	return cell;
455 700184fb Miltiadis Vasilakis
}
456 700184fb Miltiadis Vasilakis
457 700184fb Miltiadis Vasilakis
- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section
458 700184fb Miltiadis Vasilakis
{
459 700184fb Miltiadis Vasilakis
	if (section == 0) {
460 700184fb Miltiadis Vasilakis
		return 2;
461 700184fb Miltiadis Vasilakis
	} else {
462 700184fb Miltiadis Vasilakis
		return 1;
463 700184fb Miltiadis Vasilakis
	}
464 700184fb Miltiadis Vasilakis
}
465 700184fb Miltiadis Vasilakis
466 700184fb Miltiadis Vasilakis
- (NSString *)tableView:(UITableView *)aTableView titleForFooterInSection:(NSInteger)section
467 700184fb Miltiadis Vasilakis
{
468 700184fb Miltiadis Vasilakis
	if (section == [self numberOfSectionsInTableView:aTableView]-1) {
469 700184fb Miltiadis Vasilakis
		// If we're using Basic authentication and the connection is not using SSL, we'll show the plain text message
470 700184fb Miltiadis Vasilakis
		if ([[[self request] authenticationScheme] isEqualToString:(NSString *)kCFHTTPAuthenticationSchemeBasic] && ![[[[self request] url] scheme] isEqualToString:@"https"]) {
471 700184fb Miltiadis Vasilakis
			return @"Password will be sent in the clear.";
472 700184fb Miltiadis Vasilakis
		// We are using Digest, NTLM, or any scheme over SSL
473 700184fb Miltiadis Vasilakis
		} else {
474 700184fb Miltiadis Vasilakis
			return @"Password will be sent securely.";
475 700184fb Miltiadis Vasilakis
		}
476 700184fb Miltiadis Vasilakis
	}
477 700184fb Miltiadis Vasilakis
	return nil;
478 700184fb Miltiadis Vasilakis
}
479 700184fb Miltiadis Vasilakis
480 700184fb Miltiadis Vasilakis
#pragma mark -
481 700184fb Miltiadis Vasilakis
482 700184fb Miltiadis Vasilakis
@synthesize request;
483 700184fb Miltiadis Vasilakis
@synthesize type;
484 700184fb Miltiadis Vasilakis
@synthesize tableView;
485 700184fb Miltiadis Vasilakis
@synthesize didEnableRotationNotifications;
486 700184fb Miltiadis Vasilakis
@synthesize presentingController;
487 700184fb Miltiadis Vasilakis
@end