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