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 |