1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 * 19 */ 20 package org.apache.mina.proxy.handlers.socks; 21 22 import java.net.InetSocketAddress; 23 24 import org.apache.mina.proxy.handlers.ProxyRequest; 25 26 /** 27 * SocksProxyRequest.java - Wrapper class for SOCKS requests. 28 * 29 * @author <a href="http://mina.apache.org">Apache MINA Project</a> 30 * @since MINA 2.0.0-M3 31 */ 32 public class SocksProxyRequest extends ProxyRequest { 33 34 /** 35 * The SOCKS protocol version. 36 */ 37 private byte protocolVersion; 38 39 /** 40 * The command code. 41 */ 42 private byte commandCode; 43 44 /** 45 * The user name used when authenticating to the proxy server. 46 */ 47 private String userName; 48 49 /** 50 * The user's password used when authenticating to the proxy server. 51 */ 52 private String password; 53 54 /** 55 * The SOCKS server host name. 56 */ 57 private String host; 58 59 /** 60 * The SOCKS server port. 61 */ 62 private int port; 63 64 /** 65 * The Kerberos service name used in GSSAPI authentication mode. 66 */ 67 private String serviceKerberosName; 68 69 /** 70 * Constructor used when building a SOCKS4 request. 71 * 72 * @param protocolVersion the protocol version 73 * @param commandCode the command code 74 * @param endpointAddress the endpoint address 75 * @param userName the user name 76 */ 77 public SocksProxyRequest(byte protocolVersion, byte commandCode, InetSocketAddress endpointAddress, String userName) { 78 super(endpointAddress); 79 this.protocolVersion = protocolVersion; 80 this.commandCode = commandCode; 81 this.userName = userName; 82 } 83 84 /** 85 * Constructor used when building a SOCKS4a request. 86 * 87 * @param commandCode the command code 88 * @param host the server host name 89 * @param port the server port 90 * @param userName the user name 91 */ 92 public SocksProxyRequest(byte commandCode, String host, int port, String userName) { 93 this.protocolVersion = SocksProxyConstants.SOCKS_VERSION_4; 94 this.commandCode = commandCode; 95 this.userName = userName; 96 this.host = host; 97 this.port = port; 98 } 99 100 /** 101 * Returns the endpoint address resulting from the {@link #getEndpointAddress()}. 102 * If not set, it will return the {@link SocksProxyConstants#FAKE_IP} constant 103 * value which will be ignored in a SOCKS v4 request. 104 * 105 * @return the endpoint address 106 */ 107 public byte[] getIpAddress() { 108 if (getEndpointAddress() == null) { 109 return SocksProxyConstants.FAKE_IP; 110 } 111 112 return getEndpointAddress().getAddress().getAddress(); 113 } 114 115 /** 116 * Return the server port as a byte array. 117 * 118 * @return the server port 119 */ 120 public byte[] getPort() { 121 byte[] port = new byte[2]; 122 int p = (getEndpointAddress() == null ? this.port : getEndpointAddress().getPort()); 123 port[1] = (byte) p; 124 port[0] = (byte) (p >> 8); 125 return port; 126 } 127 128 /** 129 * Return the command code. 130 * 131 * @return the command code 132 */ 133 public byte getCommandCode() { 134 return commandCode; 135 } 136 137 /** 138 * Return the protocol version. 139 * 140 * @return the protocol version 141 */ 142 public byte getProtocolVersion() { 143 return protocolVersion; 144 } 145 146 /** 147 * Return the user name. 148 * 149 * @return the user name 150 */ 151 public String getUserName() { 152 return userName; 153 } 154 155 /** 156 * Return the server host name. 157 * 158 * @return the server host name 159 */ 160 public synchronized final String getHost() { 161 if (host == null) { 162 InetSocketAddress adr = getEndpointAddress(); 163 164 if (adr != null && !adr.isUnresolved()) { 165 host = getEndpointAddress().getHostName(); 166 } 167 } 168 169 return host; 170 } 171 172 /** 173 * Return the user password. 174 * 175 * @return the user password 176 */ 177 public String getPassword() { 178 return password; 179 } 180 181 /** 182 * Set the user password 183 * 184 * @param password the user password value 185 */ 186 public void setPassword(String password) { 187 this.password = password; 188 } 189 190 /** 191 * Return the Kerberos service name. 192 * 193 * @return the Kerberos service name 194 */ 195 public String getServiceKerberosName() { 196 return serviceKerberosName; 197 } 198 199 /** 200 * Set the Kerberos service name. 201 * 202 * @param serviceKerberosName the Kerberos service name 203 */ 204 public void setServiceKerberosName(String serviceKerberosName) { 205 this.serviceKerberosName = serviceKerberosName; 206 } 207 }