Skip to content

Commit

Permalink
Merge pull request #3429 from vishalduggal/timob-11728
Browse files Browse the repository at this point in the history
[TIMOB-11728][TIMOB-11697] New properties for HTTPClient on iOS
  • Loading branch information
ayeung committed Dec 4, 2012
2 parents a29e52a + 87d5d5c commit 1b9ac24
Show file tree
Hide file tree
Showing 5 changed files with 163 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
*/
package ti.modules.titanium.network;

import javax.net.ssl.X509KeyManager;
import javax.net.ssl.X509TrustManager;

import org.apache.http.MethodNotSupportedException;
import org.apache.http.auth.AuthSchemeFactory;
import org.appcelerator.kroll.KrollDict;
Expand Down Expand Up @@ -242,4 +245,20 @@ public void addAuthFactory(String scheme, Object factory)

client.addAuthFactory(scheme, (AuthSchemeFactory)factory);
}

@Kroll.method
public void addTrustManager(Object manager)
{
if (manager instanceof X509TrustManager) {
client.addTrustManager((X509TrustManager)manager);
}
}

@Kroll.method
public void addKeyManager(Object manager)
{
if (manager instanceof X509KeyManager) {
client.addKeyManager((X509KeyManager)manager);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@
import java.util.regex.Pattern;
import java.util.zip.GZIPInputStream;

import javax.net.ssl.KeyManager;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509KeyManager;
import javax.net.ssl.X509TrustManager;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
Expand Down Expand Up @@ -149,6 +154,8 @@ public class TiHTTPClient
private Uri uri;
private String url;
private ArrayList<File> tmpFiles = new ArrayList<File>();
private ArrayList<X509TrustManager> trustManagers = new ArrayList<X509TrustManager>();
private ArrayList<X509KeyManager> keyManagers = new ArrayList<X509KeyManager>();

protected HashMap<String,String> headers = new HashMap<String,String>();

Expand Down Expand Up @@ -1003,24 +1010,63 @@ protected DefaultHttpClient createClient()

protected DefaultHttpClient getClient(boolean validating)
{
SSLSocketFactory sslSocketFactory = null;
if (trustManagers.size() > 0 || keyManagers.size() > 0) {
TrustManager[] trustManagerArray = null;
KeyManager[] keyManagerArray = null;

if (trustManagers.size() > 0) {
trustManagerArray = new X509TrustManager[trustManagers.size()];
trustManagerArray = trustManagers.toArray(trustManagerArray);
}

if (keyManagers.size() > 0) {
keyManagerArray = new X509KeyManager[keyManagers.size()];
keyManagerArray = keyManagers.toArray(keyManagerArray);
}

try {
sslSocketFactory = new TiSocketFactory(keyManagerArray, trustManagerArray);
} catch(Exception e) {
Log.e(TAG, "Error creating SSLSocketFactory: " + e.getMessage());
sslSocketFactory = null;
}
}
else if (!validating) {
TrustManager trustManagerArray[] = new TrustManager[] { new NonValidatingTrustManager() };
try {
sslSocketFactory = new TiSocketFactory(null, trustManagerArray);
} catch(Exception e) {
Log.e(TAG, "Error creating SSLSocketFactory: " + e.getMessage());
sslSocketFactory = null;
}
}

if (validating) {
if (nonValidatingClient != null) {
return nonValidatingClient;
if (validatingClient == null) {
validatingClient = createClient();
}

nonValidatingClient = createClient();
nonValidatingClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
return nonValidatingClient;

} else {
if (validatingClient != null) {
return validatingClient;
if (sslSocketFactory != null) {
validatingClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", sslSocketFactory, 443));
}
else {
validatingClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
}

validatingClient = createClient();
validatingClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", new NonValidatingSSLSocketFactory(), 443));
return validatingClient;
}
else {
if (nonValidatingClient == null) {
nonValidatingClient = createClient();
}
if (sslSocketFactory != null) {
nonValidatingClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", sslSocketFactory, 443));
}
else {
//This should not happen but keeping it in place something breaks
nonValidatingClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", new NonValidatingSSLSocketFactory(), 443));
}
return nonValidatingClient;
}
}

public void send(Object userData) throws MethodNotSupportedException
Expand Down Expand Up @@ -1338,4 +1384,14 @@ protected boolean getAutoRedirect()
{
return autoRedirect;
}

protected void addKeyManager(X509KeyManager manager)
{
keyManagers.add(manager);
}

protected void addTrustManager(X509TrustManager manager)
{
trustManagers.add(manager);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/**
* Appcelerator Titanium Mobile
* Copyright (c) 2012 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Apache Public License
* Please see the LICENSE included with this distribution for details.
*/
package ti.modules.titanium.network;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;

import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;

import org.apache.http.conn.ssl.SSLSocketFactory;

public class TiSocketFactory extends SSLSocketFactory {

private SSLContext sslContext = SSLContext.getInstance("TLS");

public TiSocketFactory(KeyManager[] keyManagers, TrustManager[] trustManagers) throws NoSuchAlgorithmException,
KeyManagementException, KeyStoreException, UnrecoverableKeyException
{
super(null,null,null,null,null,null);
sslContext.init(keyManagers, trustManagers, null);
}

@Override
public Socket createSocket() throws IOException
{
return sslContext.getSocketFactory().createSocket();
}

@Override
public Socket createSocket (Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException
{
return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
}

@Override
public boolean isSecure(Socket socket) throws IllegalArgumentException
{
return true;
}
}
16 changes: 16 additions & 0 deletions iphone/Classes/TiNetworkHTTPClientProxy.m
Original file line number Diff line number Diff line change
Expand Up @@ -426,6 +426,22 @@ -(void)open:(id)args
//handled in send, as now optional
//[request setShouldRedirect:YES];

//TIMOB-11728. Expose setClientCertificates and setClientCertificateIdentity for HTTPClient
id clientCerts = [self valueForKey:@"clientCertificates"];
ENSURE_TYPE_OR_NIL(clientCerts, NSArray);
if (clientCerts != nil) {
[request setClientCertificates:clientCerts];
}
id certIdentity = [self valueForKey:@"clientCertificateIdentity"];
ENSURE_SINGLE_ARG_OR_NIL(certIdentity,NSObject);
if (certIdentity != nil) {
if ([certIdentity isKindOfClass:[NSArray class]]) {
[request setClientCertificateIdentity:(SecIdentityRef)[certIdentity objectAtIndex:0]];
}
else {
[request setClientCertificateIdentity:(SecIdentityRef)certIdentity];
}
}
//TIMOB-5435 NTLM support
[request setUsername:[TiUtils stringValue:[self valueForKey:@"username"]]];
[request setPassword:[TiUtils stringValue:[self valueForKey:@"password"]]];
Expand Down
8 changes: 8 additions & 0 deletions iphone/iphone/Titanium.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -532,6 +532,9 @@
848C25A4145F501700E1B0F1 /* TiDOMDocFragProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 848C25A3145F501600E1B0F1 /* TiDOMDocFragProxy.m */; };
848C25A5145F501700E1B0F1 /* TiDOMDocFragProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 848C25A3145F501600E1B0F1 /* TiDOMDocFragProxy.m */; };
848C25A6145F501700E1B0F1 /* TiDOMDocFragProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 848C25A3145F501600E1B0F1 /* TiDOMDocFragProxy.m */; };
84BBA58816570F90006B8C22 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84BBA58716570F90006B8C22 /* Security.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
84BBA58A16570FA0006B8C22 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84BBA58716570F90006B8C22 /* Security.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
84BBA58B16570FAF006B8C22 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84BBA58716570F90006B8C22 /* Security.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
84D541A31460B2E0005338D1 /* TiDOMNotationProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D541A21460B2DF005338D1 /* TiDOMNotationProxy.m */; };
84D541A41460B2E0005338D1 /* TiDOMNotationProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D541A21460B2DF005338D1 /* TiDOMNotationProxy.m */; };
84D541A51460B2E0005338D1 /* TiDOMNotationProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D541A21460B2DF005338D1 /* TiDOMNotationProxy.m */; };
Expand Down Expand Up @@ -1439,6 +1442,7 @@
848C259E145F46C200E1B0F1 /* TiDOMPIProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TiDOMPIProxy.m; sourceTree = "<group>"; };
848C25A2145F501600E1B0F1 /* TiDOMDocFragProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TiDOMDocFragProxy.h; sourceTree = "<group>"; };
848C25A3145F501600E1B0F1 /* TiDOMDocFragProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TiDOMDocFragProxy.m; sourceTree = "<group>"; };
84BBA58716570F90006B8C22 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
84D541A11460B2DF005338D1 /* TiDOMNotationProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TiDOMNotationProxy.h; sourceTree = "<group>"; };
84D541A21460B2DF005338D1 /* TiDOMNotationProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TiDOMNotationProxy.m; sourceTree = "<group>"; };
84D541A61460B3C7005338D1 /* TiDOMEntityProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TiDOMEntityProxy.h; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1562,6 +1566,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
84BBA58816570F90006B8C22 /* Security.framework in Frameworks */,
DADE76D413D65C590079FC75 /* libicucore.dylib in Frameworks */,
1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */,
1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,
Expand Down Expand Up @@ -1594,6 +1599,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
84BBA58A16570FA0006B8C22 /* Security.framework in Frameworks */,
24D8E498119B9D8A00F8CAA6 /* Foundation.framework in Frameworks */,
24D8E499119B9D8A00F8CAA6 /* UIKit.framework in Frameworks */,
24D8E49A119B9D8A00F8CAA6 /* CoreGraphics.framework in Frameworks */,
Expand Down Expand Up @@ -1625,6 +1631,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
84BBA58B16570FAF006B8C22 /* Security.framework in Frameworks */,
DABB37A212E8CB280026A6EA /* Foundation.framework in Frameworks */,
DABB37A312E8CB280026A6EA /* UIKit.framework in Frameworks */,
DABB37A412E8CB280026A6EA /* CoreGraphics.framework in Frameworks */,
Expand Down Expand Up @@ -2776,6 +2783,7 @@
29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {
isa = PBXGroup;
children = (
84BBA58716570F90006B8C22 /* Security.framework */,
24CA8902111160BE0084E2DE /* Classes */,
24CA8903111160C30084E2DE /* Thirdparty */,
29B97315FDCFA39411CA2CEA /* Other Sources */,
Expand Down

0 comments on commit 1b9ac24

Please sign in to comment.