diff options
author | Jay Freeman (saurik) <saurik@saurik.com> | 2014-05-20 00:59:32 -0700 |
---|---|---|
committer | Jay Freeman (saurik) <saurik@saurik.com> | 2014-05-20 00:59:32 -0700 |
commit | 754456f50dfc16895f42e9e6db4c22297e8ada2e (patch) | |
tree | 3fb8d0bbd123b7fdfbe41ac390439b98c5a2e5a7 /CyteKit | |
parent | 946c4377084df6bc7eef81ab02ec31ce09f09a43 (diff) |
Recover BrowserView authentication challenge logic.
Diffstat (limited to 'CyteKit')
-rw-r--r-- | CyteKit/WebView.h | 2 | ||||
-rw-r--r-- | CyteKit/WebView.mm | 18 | ||||
-rw-r--r-- | CyteKit/WebViewController.mm | 63 |
3 files changed, 70 insertions, 13 deletions
diff --git a/CyteKit/WebView.h b/CyteKit/WebView.h index b5fa65c..a45fde3 100644 --- a/CyteKit/WebView.h +++ b/CyteKit/WebView.h @@ -52,6 +52,8 @@ enum CYWebPolicyDecision { - (void) webView:(WebView *)view didFinishLoadForFrame:(WebFrame *)frame; - (void) webView:(WebView *)view didReceiveTitle:(NSString *)title forFrame:(WebFrame *)frame; - (void) webView:(WebView *)view didStartProvisionalLoadForFrame:(WebFrame *)frame; +- (void) webView:(WebView *)view resource:(id)identifier didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge fromDataSource:(WebDataSource *)source; +- (void) webView:(WebView *)view resource:(id)identifier didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge fromDataSource:(WebDataSource *)source; - (NSURLRequest *) webView:(WebView *)view resource:(id)resource willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response fromDataSource:(WebDataSource *)source; - (void) webViewClose:(WebView *)view; - (bool) webView:(WebView *)view shouldRunJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame; diff --git a/CyteKit/WebView.mm b/CyteKit/WebView.mm index 1575a98..696189e 100644 --- a/CyteKit/WebView.mm +++ b/CyteKit/WebView.mm @@ -260,6 +260,24 @@ static void $UIWebViewWebViewDelegate$webView$didReceiveTitle$forFrame$(UIWebVie [super webView:view didStartProvisionalLoadForFrame:frame]; } // }}} +// webView:resource:didCancelAuthenticationChallenge:fromDataSource: {{{ +- (void) webView:(WebView *)view resource:(id)identifier didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge fromDataSource:(WebDataSource *)source { + id<CyteWebViewDelegate> delegate([self delegate]); + if ([UIWebView respondsToSelector:@selector(webView:resource:didCancelAuthenticationChallenge:fromDataSource:)]) + [super webView:view resource:identifier didCancelAuthenticationChallenge:challenge fromDataSource:source]; + if ([delegate respondsToSelector:@selector(webView:resource:didCancelAuthenticationChallenge:fromDataSource:)]) + [delegate webView:view resource:identifier didCancelAuthenticationChallenge:challenge fromDataSource:source]; +} +// }}} +// webView:resource:didReceiveAuthenticationChallenge:fromDataSource: {{{ +- (void) webView:(WebView *)view resource:(id)identifier didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge fromDataSource:(WebDataSource *)source { + id<CyteWebViewDelegate> delegate([self delegate]); + if ([UIWebView respondsToSelector:@selector(webView:resource:didReceiveAuthenticationChallenge:fromDataSource:)]) + [super webView:view resource:identifier didReceiveAuthenticationChallenge:challenge fromDataSource:source]; + if ([delegate respondsToSelector:@selector(webView:resource:didReceiveAuthenticationChallenge:fromDataSource:)]) + [delegate webView:view resource:identifier didReceiveAuthenticationChallenge:challenge fromDataSource:source]; +} +// }}} // webView:resource:willSendRequest:redirectResponse:fromDataSource: (3.2+) {{{ static NSURLRequest *$UIWebViewWebViewDelegate$webView$resource$willSendRequest$redirectResponse$fromDataSource$(UIWebViewWebViewDelegate *self, SEL sel, WebView *view, id identifier, NSURLRequest *request, NSURLResponse *response, WebDataSource *source) { UIWebView *uiWebView(MSHookIvar<UIWebView *>(self, "uiWebView")); diff --git a/CyteKit/WebViewController.mm b/CyteKit/WebViewController.mm index c4931cb..f047ed3 100644 --- a/CyteKit/WebViewController.mm +++ b/CyteKit/WebViewController.mm @@ -636,6 +636,49 @@ float CYScrollViewDecelerationRateNormal; [self _didStartLoading]; } +- (void) webView:(WebView *)view resource:(id)identifier didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge fromDataSource:(WebDataSource *)source { + challenge_ = [challenge retain]; + + NSURLProtectionSpace *space([challenge protectionSpace]); + NSString *realm([space realm]); + if (realm == nil) + realm = @""; + + UIAlertView *alert = [[[UIAlertView alloc] + initWithTitle:realm + message:nil + delegate:self + cancelButtonTitle:UCLocalize("CANCEL") + otherButtonTitles:UCLocalize("LOGIN"), nil + ] autorelease]; + + [alert setContext:@"challenge"]; + [alert setNumberOfRows:1]; + + [alert addTextFieldWithValue:@"" label:UCLocalize("USERNAME")]; + [alert addTextFieldWithValue:@"" label:UCLocalize("PASSWORD")]; + + UITextField *username([alert textFieldAtIndex:0]); { + UITextInputTraits *traits([username textInputTraits]); + [traits setAutocapitalizationType:UITextAutocapitalizationTypeNone]; + [traits setAutocorrectionType:UITextAutocorrectionTypeNo]; + [traits setKeyboardType:UIKeyboardTypeASCIICapable]; + [traits setReturnKeyType:UIReturnKeyNext]; + } + + UITextField *password([alert textFieldAtIndex:1]); { + UITextInputTraits *traits([password textInputTraits]); + [traits setAutocapitalizationType:UITextAutocapitalizationTypeNone]; + [traits setAutocorrectionType:UITextAutocorrectionTypeNo]; + [traits setKeyboardType:UIKeyboardTypeASCIICapable]; + // XXX: UIReturnKeyDone + [traits setReturnKeyType:UIReturnKeyNext]; + [traits setSecureTextEntry:YES]; + } + + [alert show]; +} + - (NSURLRequest *) webView:(WebView *)view resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response fromDataSource:(WebDataSource *)source { #if LogBrowser NSLog(@"resource:%@ willSendRequest:%@ redirectResponse:%@ fromDataSource:%@", identifier, request, response, source); @@ -683,21 +726,15 @@ float CYScrollViewDecelerationRateNormal; } else if ([context isEqualToString:@"challenge"]) { id<NSURLAuthenticationChallengeSender> sender([challenge_ sender]); - switch (button) { - case 1: { - NSString *username([[alert textFieldAtIndex:0] text]); - NSString *password([[alert textFieldAtIndex:1] text]); - - NSURLCredential *credential([NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistenceForSession]); + if (button == [alert cancelButtonIndex]) + [sender cancelAuthenticationChallenge:challenge_]; + else if (button == [alert firstOtherButtonIndex]) { + NSString *username([[alert textFieldAtIndex:0] text]); + NSString *password([[alert textFieldAtIndex:1] text]); - [sender useCredential:credential forAuthenticationChallenge:challenge_]; - } break; - - case 2: - [sender cancelAuthenticationChallenge:challenge_]; - break; + NSURLCredential *credential([NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistenceForSession]); - _nodefault + [sender useCredential:credential forAuthenticationChallenge:challenge_]; } challenge_ = nil; |