1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $RCSfile$ 3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Revision$ 4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Date$ 5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License. 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * http://www.apache.org/licenses/LICENSE-2.0 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS, 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License. 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.jivesoftware.smackx.bytestreams.socks5; 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.IOException; 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.InputStream; 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.OutputStream; 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.net.Socket; 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.net.SocketException; 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.bytestreams.BytestreamSession; 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Socks5BytestreamSession class represents a SOCKS5 Bytestream session. 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Henning Staib 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class Socks5BytestreamSession implements BytestreamSession { 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /* the underlying socket of the SOCKS5 Bytestream */ 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private final Socket socket; 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /* flag to indicate if this session is a direct or mediated connection */ 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private final boolean isDirect; 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen protected Socks5BytestreamSession(Socket socket, boolean isDirect) { 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.socket = socket; 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.isDirect = isDirect; 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns <code>true</code> if the session is established through a direct connection between 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * the initiator and target, <code>false</code> if the session is mediated over a SOCKS proxy. 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return <code>true</code> if session is a direct connection, <code>false</code> if session is 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * mediated over a SOCKS5 proxy 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public boolean isDirect() { 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return this.isDirect; 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns <code>true</code> if the session is mediated over a SOCKS proxy, <code>false</code> 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * if this session is established through a direct connection between the initiator and target. 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return <code>true</code> if session is mediated over a SOCKS5 proxy, <code>false</code> if 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * session is a direct connection 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public boolean isMediated() { 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return !this.isDirect; 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public InputStream getInputStream() throws IOException { 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return this.socket.getInputStream(); 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public OutputStream getOutputStream() throws IOException { 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return this.socket.getOutputStream(); 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public int getReadTimeout() throws IOException { 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen try { 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return this.socket.getSoTimeout(); 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen catch (SocketException e) { 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IOException("Error on underlying Socket"); 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void setReadTimeout(int timeout) throws IOException { 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen try { 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.socket.setSoTimeout(timeout); 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen catch (SocketException e) { 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IOException("Error on underlying Socket"); 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void close() throws IOException { 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.socket.close(); 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 99