summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay Freeman (saurik) <saurik@saurik.com>2014-05-20 00:59:32 -0700
committerJay Freeman (saurik) <saurik@saurik.com>2014-05-20 00:59:32 -0700
commit754456f50dfc16895f42e9e6db4c22297e8ada2e (patch)
tree3fb8d0bbd123b7fdfbe41ac390439b98c5a2e5a7
parent946c4377084df6bc7eef81ab02ec31ce09f09a43 (diff)
Recover BrowserView authentication challenge logic.
-rw-r--r--CyteKit/WebView.h2
-rw-r--r--CyteKit/WebView.mm18
-rw-r--r--CyteKit/WebViewController.mm63
-rw-r--r--iPhonePrivate.h2
4 files changed, 72 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;
diff --git a/iPhonePrivate.h b/iPhonePrivate.h
index d95c7f4..0066620 100644
--- a/iPhonePrivate.h
+++ b/iPhonePrivate.h
@@ -330,6 +330,8 @@ static const UIActivityIndicatorViewStyle UIActivityIndicatorViewStyleWhiteTiny(
- (void) webView:(WebView *)view didFinishLoadForFrame:(WebFrame *)frame;
- (void) webView:(WebView *)view didReceiveTitle:(id)title forFrame:(id)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)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response fromDataSource:(WebDataSource *)source;
- (void) webView:(WebView *)view runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame;
- (BOOL) webView:(WebView *)view runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame;