View Javadoc

    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 }