home *** CD-ROM | disk | FTP | other *** search
- package java.net;
-
- import java.io.ByteArrayOutputStream;
- import java.io.FileDescriptor;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.security.AccessController;
- import sun.security.action.GetPropertyAction;
- import sun.security.action.LoadLibraryAction;
-
- class PlainSocketImpl extends SocketImpl {
- static int preferredConnectionTimeout = 0;
- int timeout;
- private static final int SOCKS_PROTO_VERS = 4;
- private static final int SOCKS_REPLY_VERS = 4;
- private static final int COMMAND_CONNECT = 1;
- private static final int COMMAND_BIND = 2;
- private static final int REQUEST_GRANTED = 90;
- private static final int REQUEST_REJECTED = 91;
- private static final int REQUEST_REJECTED_NO_IDENTD = 92;
- private static final int REQUEST_REJECTED_DIFF_IDENTS = 93;
- public static final String socksServerProp = "socksProxyHost";
- public static final String socksPortProp = "socksProxyPort";
- public static final String socksDefaultPortStr = "1080";
- private boolean shut_rd = false;
- private boolean shut_wr = false;
- private SocketInputStream socketInputStream = null;
- public static final int SHUT_RD = 0;
- public static final int SHUT_WR = 1;
-
- protected synchronized void create(boolean var1) throws IOException {
- super.fd = new FileDescriptor();
- this.socketCreate(var1);
- }
-
- protected void connect(String var1, int var2) throws UnknownHostException, IOException {
- Object var3 = null;
-
- try {
- InetAddress var4 = InetAddress.getByName(var1);
-
- try {
- this.connectToAddress(var4, var2);
- return;
- } catch (IOException var6) {
- var3 = var6;
- }
- } catch (UnknownHostException var7) {
- var3 = var7;
- }
-
- this.close();
- throw var3;
- }
-
- protected void connect(InetAddress var1, int var2) throws IOException {
- super.port = var2;
- super.address = var1;
-
- try {
- this.connectToAddress(var1, var2);
- } catch (IOException var4) {
- this.close();
- throw var4;
- }
- }
-
- private void connectToAddress(InetAddress var1, int var2) throws IOException {
- if (this.usingSocks()) {
- this.doSOCKSConnect(var1, var2);
- } else {
- this.doConnect(var1, var2);
- }
-
- }
-
- public void setOption(int var1, Object var2) throws SocketException {
- boolean var3 = true;
- switch (var1) {
- case 1:
- if (var2 == null || !(var2 instanceof Boolean)) {
- throw new SocketException("bad parameter for TCP_NODELAY");
- }
-
- var3 = (Boolean)var2;
- break;
- case 8:
- if (var2 == null || !(var2 instanceof Boolean)) {
- throw new SocketException("bad parameter for SO_KEEPALIVE");
- }
-
- var3 = (Boolean)var2;
- break;
- case 15:
- throw new SocketException("Cannot re-bind socket");
- case 128:
- if (var2 == null || !(var2 instanceof Integer) && !(var2 instanceof Boolean)) {
- throw new SocketException("Bad parameter for option");
- }
-
- if (var2 instanceof Boolean) {
- var3 = false;
- }
- break;
- case 4097:
- case 4098:
- if (var2 == null || !(var2 instanceof Integer) || (Integer)var2 <= 0) {
- throw new SocketException("bad parameter for SO_SNDBUF or SO_RCVBUF");
- }
- break;
- case 4102:
- if (var2 != null && var2 instanceof Integer) {
- int var4 = (Integer)var2;
- if (var4 < 0) {
- throw new IllegalArgumentException("timeout < 0");
- }
-
- this.timeout = var4;
- return;
- }
-
- throw new SocketException("Bad parameter for SO_TIMEOUT");
- default:
- throw new SocketException("unrecognized TCP option: " + var1);
- }
-
- this.socketSetOption(var1, var3, var2);
- }
-
- public Object getOption(int var1) throws SocketException {
- if (var1 == 4102) {
- return new Integer(this.timeout);
- } else {
- int var2 = this.socketGetOption(var1);
- switch (var1) {
- case 1:
- return var2 == -1 ? new Boolean(false) : new Boolean(true);
- case 8:
- return var2 == -1 ? new Boolean(false) : new Boolean(true);
- case 15:
- InetAddress var3 = new InetAddress();
- var3.address = var2;
- return var3;
- case 128:
- return var2 == -1 ? new Boolean(false) : new Integer(var2);
- case 4097:
- case 4098:
- return new Integer(var2);
- default:
- return null;
- }
- }
- }
-
- private void doSOCKSConnect(InetAddress var1, int var2) throws IOException {
- this.connectToSocksServer();
- this.sendSOCKSCommandPacket(1, var1, var2);
- int var3 = this.getSOCKSReply();
- switch (var3) {
- case 90:
- return;
- case 91:
- case 92:
- throw new SocketException("SOCKS server cannot connect to identd");
- case 93:
- throw new SocketException("User name does not match identd name");
- default:
- }
- }
-
- private int getSOCKSReply() throws IOException {
- InputStream var1 = this.getInputStream();
- byte[] var2 = new byte[8];
- int var3 = 0;
- int var4 = var2.length;
-
- for(int var5 = 0; var3 < var4 && var5 < 3; ++var5) {
- int var6 = var1.read(var2, var3, var4 - var3);
- if (var6 < 0) {
- throw new SocketException("Malformed reply from SOCKS server");
- }
-
- var3 += var6;
- }
-
- if (var3 != var4) {
- throw new SocketException("Reply from SOCKS server has bad length: " + var3);
- } else if (var2[0] != 0) {
- throw new SocketException("Reply from SOCKS server has bad version " + var2[0]);
- } else {
- return var2[1];
- }
- }
-
- private void connectToSocksServer() throws IOException {
- Object var1 = null;
- Object var2 = null;
- String var7 = (String)AccessController.doPrivileged(new GetPropertyAction("socksProxyHost"));
- String var8 = (String)AccessController.doPrivileged(new GetPropertyAction("socksProxyPort", "1080"));
- if (var7 != null) {
- InetAddress var3 = InetAddress.getByName(var7);
-
- int var4;
- try {
- var4 = Integer.parseInt(var8);
- } catch (Exception var6) {
- throw new SocketException("Bad port number format");
- }
-
- this.doConnect(var3, var4);
- }
- }
-
- private void doConnect(InetAddress var1, int var2) throws IOException {
- ProtocolException var3 = null;
- int var4 = 0;
-
- while(var4 < 3) {
- try {
- this.socketConnect(var1, var2);
- return;
- } catch (ProtocolException var7) {
- this.close();
- super.fd = new FileDescriptor();
- this.socketCreate(true);
- var3 = var7;
- ++var4;
- } catch (IOException var8) {
- this.close();
- throw var8;
- }
- }
-
- this.close();
- throw var3;
- }
-
- private void sendSOCKSCommandPacket(int var1, InetAddress var2, int var3) throws IOException {
- byte[] var4 = this.makeCommandPacket(var1, var2, var3);
- OutputStream var5 = this.getOutputStream();
- var5.write(var4);
- }
-
- private byte[] makeCommandPacket(int var1, InetAddress var2, int var3) {
- ByteArrayOutputStream var4 = new ByteArrayOutputStream(9);
- var4.write(4);
- var4.write(var1);
- var4.write(var3 >> 8 & 255);
- var4.write(var3 >> 0 & 255);
- byte[] var5 = var2.getAddress();
- var4.write(var5, 0, var5.length);
- String var6 = (String)AccessController.doPrivileged(new GetPropertyAction("user.name"));
- byte[] var7 = new byte[var6.length()];
- var6.getBytes(0, var6.length(), var7, 0);
- var4.write(var7, 0, var7.length);
- var4.write(0);
- return var4.toByteArray();
- }
-
- private boolean usingSocks() {
- String var1 = (String)AccessController.doPrivileged(new GetPropertyAction("socksProxyHost"));
- return var1 != null;
- }
-
- protected synchronized void bind(InetAddress var1, int var2) throws IOException {
- this.socketBind(var1, var2);
- }
-
- protected synchronized void listen(int var1) throws IOException {
- this.socketListen(var1);
- }
-
- protected synchronized void accept(SocketImpl var1) throws IOException {
- this.socketAccept(var1);
- }
-
- protected synchronized InputStream getInputStream() throws IOException {
- if (super.fd == null) {
- throw new IOException("Socket Closed");
- } else if (this.shut_rd) {
- throw new IOException("Socket input is shutdown");
- } else {
- if (this.socketInputStream == null) {
- this.socketInputStream = new SocketInputStream(this);
- }
-
- return this.socketInputStream;
- }
- }
-
- protected synchronized OutputStream getOutputStream() throws IOException {
- if (super.fd == null) {
- throw new IOException("Socket Closed");
- } else if (this.shut_wr) {
- throw new IOException("Socket output is shutdown");
- } else {
- return new SocketOutputStream(this);
- }
- }
-
- protected synchronized int available() throws IOException {
- if (super.fd == null) {
- throw new IOException("Stream closed.");
- } else {
- return this.socketAvailable();
- }
- }
-
- protected void close() throws IOException {
- if (super.fd != null) {
- this.socketClose();
- super.fd = null;
- }
-
- }
-
- protected void shutdownInput() throws IOException {
- if (super.fd != null) {
- this.socketShutdown(0);
- if (this.socketInputStream != null) {
- this.socketInputStream.setEOF(true);
- }
-
- this.shut_rd = true;
- }
-
- }
-
- protected void shutdownOutput() throws IOException {
- if (super.fd != null) {
- this.socketShutdown(1);
- this.shut_wr = true;
- }
-
- }
-
- protected void finalize() throws IOException {
- this.close();
- }
-
- private native void socketCreate(boolean var1) throws IOException;
-
- private native void socketConnect(InetAddress var1, int var2) throws IOException;
-
- private native void socketBind(InetAddress var1, int var2) throws IOException;
-
- private native void socketListen(int var1) throws IOException;
-
- private native void socketAccept(SocketImpl var1) throws IOException;
-
- private native int socketAvailable() throws IOException;
-
- private native void socketClose() throws IOException;
-
- private native void socketShutdown(int var1) throws IOException;
-
- private static native void initProto();
-
- private native void socketSetOption(int var1, boolean var2, Object var3) throws SocketException;
-
- private native int socketGetOption(int var1) throws SocketException;
-
- static {
- AccessController.doPrivileged(new LoadLibraryAction("net"));
- String var0 = (String)AccessController.doPrivileged(new GetPropertyAction("java.net.connectiontimeout"));
- if (var0 != null) {
- preferredConnectionTimeout = Integer.parseInt(var0);
- }
-
- initProto();
- }
- }
-