You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by gh...@apache.org on 2006/04/24 23:41:00 UTC

svn commit: r396693 - in /incubator/harmony/enhanced/classlib/trunk/modules: luni/src/main/java/java/net/ luni/src/main/java/org/apache/harmony/luni/net/ luni/src/test/java/tests/api/java/net/ nio/src/main/java/org/apache/harmony/nio/internal/

Author: gharley
Date: Mon Apr 24 14:40:59 2006
New Revision: 396693

URL: http://svn.apache.org/viewcvs?rev=396693&view=rev
Log:
HARMONY-359 : Java 5 Enhancement: One new constructor Socket(Proxy p) in class java.net.Socket

Modified:
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/net/Socket.java
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/NetUtil.java
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/PlainSocketImpl.java
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/PlainSocketImpl2.java
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/SocketImplProvider.java
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/net/SocketTest.java
    incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/ServerSocketChannelImpl.java

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/net/Socket.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/net/Socket.java?rev=396693&r1=396692&r2=396693&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/net/Socket.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/net/Socket.java Mon Apr 24 14:40:59 2006
@@ -25,7 +25,6 @@
 import org.apache.harmony.luni.net.NetUtil;
 import org.apache.harmony.luni.net.SocketImplProvider;
 import org.apache.harmony.luni.platform.Platform;
-
 import org.apache.harmony.luni.util.Msg;
 import org.apache.harmony.luni.util.PriviAction;
 
@@ -52,6 +51,8 @@
 	private boolean isOutputShutdown = false;
 
 	private Object connectLock = new Object();
+	
+	private Proxy proxy;
 
 	static final int MULTICAST_IF = 1;
 
@@ -79,6 +80,41 @@
 		impl = factory != null ? factory.createSocketImpl()
 				: SocketImplProvider.getSocketImpl();
 	}
+	/**
+	 * Constructs a connection-oriented Socket with specified 
+	 * <code>proxy</code>. 
+	 * 
+	 * Method <code>checkConnect</code> is called if a security manager exists,
+	 * and the proxy host address and port number are passed as parameters.  
+	 * 
+	 * @param proxy
+	 *            the specified proxy for this Socket.
+	 * @throws IllegalArgumentException
+	 *             if the proxy is null or of an invalid type.
+	 * @throws SecurityException
+	 *             if a security manager exists and it denies the permission
+	 *             to connect to proxy. 
+	 */
+	public Socket(Proxy proxy){
+		if(null == proxy || Proxy.Type.HTTP == proxy.type()){
+			throw new IllegalArgumentException("proxy is null or invalid type");
+		}
+		InetSocketAddress address = (InetSocketAddress)proxy.address();
+		if(null != address){
+			InetAddress addr = address.getAddress();
+			String host;
+			if(null != addr){
+				host = addr.getHostAddress();
+			}else{
+				host = address.getHostName();
+			}
+			int port = address.getPort();
+			checkConnectPermission(host, port);
+		}
+		impl = factory != null ? factory.createSocketImpl()
+				: SocketImplProvider.getSocketImpl(proxy);
+		this.proxy = proxy;
+	}
 
 	/**
 	 * Construct a stream socket connected to the nominated destination
@@ -248,11 +284,25 @@
 	 *            the port on the destination host
 	 */
 	void checkDestination(InetAddress destAddr, int dstPort) {
-		if (dstPort < 0 || dstPort > 65535)
+		if (dstPort < 0 || dstPort > 65535){
 			throw new IllegalArgumentException(Msg.getString("K0032"));
+		}
+		checkConnectPermission(destAddr.getHostName(), dstPort);
+	}
+	
+	/*
+	 * Checks the connection destination satisfies the security policy.
+	 * 
+	 * @param hostname
+	 *            the destination hostname
+	 * @param dstPort
+	 *            the port on the destination host
+	 */
+	private void checkConnectPermission(String hostname, int dstPort) {
 		SecurityManager security = System.getSecurityManager();
-		if (security != null)
-			security.checkConnect(destAddr.getHostName(), dstPort);
+		if (security != null){
+			security.checkConnect(hostname, dstPort);
+		}
 	}
 
 	/**
@@ -646,8 +696,9 @@
 			impl.create(streaming);
 			isCreated = true;
 			try {
-				if (!streaming || !NetUtil.usingSocks())
+				if (!streaming || !NetUtil.usingSocks(proxy)){
 					impl.bind(addr, localPort);
+				}
 				isBound = true;
 				impl.connect(dstAddress, dstPort);
 				isConnected = true;
@@ -820,8 +871,9 @@
 
 		synchronized (this) {
 			try {
-				if (!NetUtil.usingSocks())
+				if (!NetUtil.usingSocks(proxy)){
 					impl.bind(addr, port);
+				}
 				isBound = true;
 			} catch (IOException e) {
 				impl.close();
@@ -891,8 +943,9 @@
 					// checkClosedAndCreate
 					// this caused us to lose socket options on create
 					// impl.create(true);
-					if (!NetUtil.usingSocks())
+					if (!NetUtil.usingSocks(proxy)){
 						impl.bind(InetAddress.ANY, 0);
+					}
 					isBound = true;
 				}
 				impl.connect(remoteAddr, timeout);

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/NetUtil.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/NetUtil.java?rev=396693&r1=396692&r2=396693&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/NetUtil.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/NetUtil.java Mon Apr 24 14:40:59 2006
@@ -14,6 +14,7 @@
  */
 package org.apache.harmony.luni.net;
 
+import java.net.Proxy;
 import java.security.AccessController;
 
 import org.apache.harmony.luni.util.PriviAction;
@@ -25,11 +26,23 @@
      */
     
     /**
-     * Answer whether to use a SOCKS proxy.
-     * 
-     * @return boolean
-     */
-    public static boolean usingSocks() {
+	 * Answer whether to use a SOCKS proxy.
+	 * 
+	 * @param proxy
+	 *            java.net.Proxy, may be <code>null</code> in which case the 
+     *            return value is determined from the values of the 
+     *            "socksProxySet" and "socksProxyHost" system properties.
+	 * @return true if SOCKS proxy is set by <code>proxy</code> parameter or
+     *         else "socksProxySet" system property is set and has the value
+     *         of "true" or if "socksProxyHost" is set in system properties.
+	 */
+    public static boolean usingSocks(Proxy proxy) {
+    	if(null != proxy && Proxy.NO_PROXY == proxy){
+    		return false;
+    	}
+    	if(null != proxy && Proxy.Type.SOCKS == proxy.type()){
+    		return true;
+    	}
         String proxySet = (String) AccessController
                 .doPrivileged(new PriviAction("socksProxySet"));
         if (proxySet != null) {

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/PlainSocketImpl.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/PlainSocketImpl.java?rev=396693&r1=396692&r2=396693&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/PlainSocketImpl.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/PlainSocketImpl.java Mon Apr 24 14:40:59 2006
@@ -23,6 +23,7 @@
 import java.net.ConnectException;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
+import java.net.Proxy;
 import java.net.SocketAddress;
 import java.net.SocketException;
 import java.net.SocketImpl;
@@ -31,14 +32,8 @@
 import java.net.UnknownHostException;
 import java.security.AccessController;
 
-import org.apache.harmony.luni.net.NetUtil;
-import org.apache.harmony.luni.net.PlainSocketImpl;
-import org.apache.harmony.luni.net.SocketInputStream;
-import org.apache.harmony.luni.net.SocketOutputStream;
-import org.apache.harmony.luni.net.Socks4Message;
 import org.apache.harmony.luni.platform.INetworkSystem;
 import org.apache.harmony.luni.platform.Platform;
-
 import org.apache.harmony.luni.util.Msg;
 import org.apache.harmony.luni.util.PriviAction;
 
@@ -79,6 +74,8 @@
 	public boolean streaming = true;
 
 	public boolean shutdownInput = false;
+	
+	Proxy proxy = null;
 
 	/**
 	 * Accepts a connection on the provided socket, by calling the IP stack.
@@ -89,7 +86,7 @@
 	 *                if an error occurs while accepting
 	 */
 	protected void accept(SocketImpl newImpl) throws IOException {
-		if (NetUtil.usingSocks()) {
+		if (NetUtil.usingSocks(proxy)) {
 			((PlainSocketImpl) newImpl).socksBind();
 			((PlainSocketImpl) newImpl).socksAccept();
 			return;
@@ -136,7 +133,7 @@
 	 *                if an error occurs while binding
 	 */
 	protected void bind(InetAddress anAddr, int aPort) throws IOException {
-		if (NetUtil.usingSocks()) {
+		if (NetUtil.usingSocks(proxy)) {
 			socksBind();
 			return;
 		}
@@ -224,7 +221,7 @@
 
 		try {
 			if (streaming) {
-				if (NetUtil.usingSocks()) {
+				if (NetUtil.usingSocks(proxy)) {
 					socksConnect(anAddr, aPort, 0);
 				} else {
 					if (timeout == 0) {
@@ -343,7 +340,7 @@
 	 *                thrown if an error occurs while listening
 	 */
 	protected void listen(int backlog) throws IOException {
-		if (NetUtil.usingSocks()) {
+		if (NetUtil.usingSocks(proxy)) {
 			// Do nothing for a SOCKS connection. The listen occurs on the
 			// server during the bind.
 			return;
@@ -400,7 +397,13 @@
 	 */
 	private int socksGetServerPort() {
 		int portValue = -1;
-
+		
+		if(null != proxy && Proxy.Type.SOCKS == proxy.type()){
+			// get from proxy first
+			InetSocketAddress addr = (InetSocketAddress)proxy.address();
+			return addr.getPort();
+		}
+		
 		String proxyPort = (String) AccessController
 				.doPrivileged(new PriviAction("socksProxyPort"));
 
@@ -418,9 +421,19 @@
 	 * Get the InetAddress of the SOCKS proxy server.
 	 */
 	private InetAddress socksGetServerAddress() throws UnknownHostException {
-		String proxyName = (String) AccessController
+		String proxyName;
+		if(null != proxy && Proxy.Type.SOCKS == proxy.type()){
+			// get from proxy first
+			InetSocketAddress addr = (InetSocketAddress)proxy.address();
+			proxyName = addr.getHostName();
+			if(null == proxyName){
+				proxyName = addr.getAddress().getHostAddress();
+			}
+		}else{
+			// get from system properties
+			proxyName = (String) AccessController
 				.doPrivileged(new PriviAction("socksProxyHost"));
-
+		}
 		InetAddress anAddr = netImpl.getHostByName(proxyName,
                 NetUtil.preferIPv6Addresses());
 		return anAddr;

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/PlainSocketImpl2.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/PlainSocketImpl2.java?rev=396693&r1=396692&r2=396693&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/PlainSocketImpl2.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/PlainSocketImpl2.java Mon Apr 24 14:40:59 2006
@@ -18,10 +18,9 @@
 import java.io.FileDescriptor;
 import java.io.IOException;
 import java.net.InetAddress;
+import java.net.Proxy;
 import java.net.SocketException;
 
-import org.apache.harmony.luni.net.NetUtil;
-
 
 /**
  * This class was added so we can create sockets without options that were
@@ -43,6 +42,14 @@
     
     public PlainSocketImpl2(){
         super();
+    }
+    
+    /*
+     * creates an instance with specified proxy.
+     */
+    public PlainSocketImpl2(Proxy proxy){
+    	super();
+    	this.proxy = proxy;
     }
 
     /**

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/SocketImplProvider.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/SocketImplProvider.java?rev=396693&r1=396692&r2=396693&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/SocketImplProvider.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/net/SocketImplProvider.java Mon Apr 24 14:40:59 2006
@@ -17,6 +17,7 @@
 import java.io.FileDescriptor;
 import java.net.DatagramSocketImpl;
 import java.net.InetAddress;
+import java.net.Proxy;
 import java.net.SocketImpl;
 
 
@@ -24,6 +25,12 @@
     
     public static SocketImpl getSocketImpl(){
         return new PlainSocketImpl2();
+    }
+    /*
+     * gets a SocketImpl with specified proxy.
+     */
+    public static SocketImpl getSocketImpl(Proxy proxy){
+        return new PlainSocketImpl2(proxy);
     }
     
     public static SocketImpl getSocketImpl(FileDescriptor fd, int localport, InetAddress addr, int port){

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/net/SocketTest.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/net/SocketTest.java?rev=396693&r1=396692&r2=396693&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/net/SocketTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/net/SocketTest.java Mon Apr 24 14:40:59 2006
@@ -24,11 +24,13 @@
 import java.net.Inet6Address;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
+import java.net.Proxy;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.net.SocketAddress;
 import java.net.SocketException;
 import java.net.SocketTimeoutException;
+import java.security.Permission;
 
 import tests.support.Support_Configuration;
 import tests.support.Support_PortManager;
@@ -2514,8 +2516,87 @@
 	}
 	
 	/**
-	 * 
+	 * @tests java.net.Socket#Socket(Proxy)
 	 */
+	public void test_ConstructorLjava_net_Proxy_Exception() {
+
+	    SocketAddress addr1 = InetSocketAddress.createUnresolved("127.0.0.1",
+	            80);
+	    SocketAddress addr2 = new InetSocketAddress("localhost", 80);
+
+	    Proxy proxy1 = new Proxy(Proxy.Type.HTTP, addr1);
+	    // IllegalArgumentException test
+	    try {
+	        new Socket(proxy1);
+	        fail("should throw IllegalArgumentException");
+	    } catch (IllegalArgumentException e) {
+	        // expected
+	    }
+
+	    Proxy proxy2 = new Proxy(Proxy.Type.SOCKS, addr1);
+	    try {
+	        new Socket(proxy2);
+	    } catch (IllegalArgumentException e) {
+	        fail("should not throw IllegalArgumentException");
+	    }
+
+	    try {
+	        new Socket(Proxy.NO_PROXY);
+	    } catch (IllegalArgumentException e) {
+	        fail("should not throw IllegalArgumentException");
+	    }
+
+	    // SecurityException test
+	    SecurityManager originalSecurityManager = System.getSecurityManager();
+	    try {
+	        System.setSecurityManager(new MockSecurityManager());
+	    } catch (SecurityException e) {
+	        System.err
+	        .println("No permission to setSecurityManager, security related test in test_ConstructorLjava_net_Proxy_Security is ignored");
+	        return;
+	    }
+
+	    Proxy proxy3 = new Proxy(Proxy.Type.SOCKS, addr1);
+	    Proxy proxy4 = new Proxy(Proxy.Type.SOCKS, addr2);
+	    try {
+	        try {
+	            new Socket(proxy3);
+	            fail("should throw SecurityException");
+	        } catch (SecurityException e) {
+	            // expected
+	        }
+	        try {
+	            new Socket(proxy4);
+	            fail("should throw SecurityException");
+	        } catch (SecurityException e) {
+	            // expected
+	        }
+	    } finally {
+	        System.setSecurityManager(originalSecurityManager);
+	    }
+
+	}
+
+	static class MockSecurityManager extends SecurityManager {
+
+	    public void checkConnect(String host, int port) {
+	        if ("127.0.0.1".equals(host)) {
+	            throw new SecurityException("permission is not allowed");
+	        }
+	    }
+
+	    public void checkPermission(Permission permission) {
+	        if ("setSecurityManager".equals(permission.getName())) {
+	            return;
+	        }
+	        super.checkPermission(permission);
+	    }
+
+	}
+    
+	/**
+     * 
+     */
 	protected int startServer(String name) {
 		int portNumber = Support_PortManager.getNextPort();
 		try {

Modified: incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/ServerSocketChannelImpl.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/ServerSocketChannelImpl.java?rev=396693&r1=396692&r2=396693&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/ServerSocketChannelImpl.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/ServerSocketChannelImpl.java Mon Apr 24 14:40:59 2006
@@ -250,7 +250,7 @@
             // close the
             // ServerSocket as well. The ServerSocket cannot be used for a
             // second accept.
-            if (NetUtil.usingSocks()) {
+            if (NetUtil.usingSocks(null)) {
                 return super.accept();
             }