Exemplo n.º 1
0
        /// <summary>
        /// Open a TCPIP forwarding channel to the remote computer. If successful the remote computer will open
        /// a socket to the host/port specified and return a channel which can be used to forward TCPIP data
        /// from the local computer to the remotley connected socket.<br/>
        /// <br/>
        ///	It should be noted that this is a low level API method and it does not connect the transport to the
        ///	channel. Future versions of this API will provide a ForwardingClient to automate transfer between
        ///	the tunnel and a local listening Socket.
        /// </summary>
        /// <param name="hostname"></param>
        /// <param name="port"></param>
        /// <param name="listeningAddress"></param>
        /// <param name="listeningPort"></param>
        /// <param name="originatingHost"></param>
        /// <param name="originatingPort"></param>
        /// <param name="transport"></param>
        /// <param name="listener"></param>
        /// <returns></returns>
        public SSHTunnel OpenForwardingChannel(System.String hostname,
                                               int port,
                                               System.String listeningAddress,
                                               int listeningPort,
                                               System.String originatingHost,
                                               int originatingPort,
                                               Object transport,
                                               ChannelStateListener listener)
        {
            try
            {
                SSH2ForwardingChannel tunnel = new SSH2ForwardingChannel(
                    SSH2ForwardingChannel.LOCAL_FORWARDING_CHANNEL,
                    131072,
                    32768,
                    hostname,
                    port,
                    listeningAddress,
                    listeningPort,
                    originatingHost,
                    originatingPort,
                    transport,
                    true);

                ByteBuffer request = new ByteBuffer();
                request.WriteString(hostname);
                request.WriteUINT32(port);
                request.WriteString(originatingHost);
                request.WriteUINT32(originatingPort);

                if (listener != null)
                {
                    tunnel.StateChange += listener;
                }

                OpenChannel(tunnel, request.ToByteArray());

                tunnel.ResumeWindow();

                return(tunnel);
            }
            catch (System.IO.IOException ex)
            {
                throw new SSHException(ex.Message, SSHException.INTERNAL_ERROR);
            }
        }
Exemplo n.º 2
0
            public SSH2Channel CreateChannel(String channeltype, byte[] requestdata)
            {
                if (channeltype.Equals(SSH2ForwardingChannel.REMOTE_FORWARDING_CHANNEL))
                {
                    try
                    {
                        ByteBuffer    bar            = new ByteBuffer(requestdata);
                        System.String address        = bar.ReadString();
                        int           port           = (int)bar.ReadUINT32();
                        System.String originatorIP   = bar.ReadString();
                        int           originatorPort = (int)bar.ReadUINT32();

                        System.String key = address + ":" + port.ToString();
                        if (enclosingInstance.forwardingListeners.ContainsKey(key))
                        {
                            ForwardingRequestListener listener = (ForwardingRequestListener)enclosingInstance.forwardingListeners[key];
                            String destination   = (System.String)enclosingInstance.forwardingDestinations[key];
                            String hostToConnect = destination.Substring(0, (destination.IndexOf((System.Char) ':')) - (0));
                            int    portToConnect = System.Int32.Parse(destination.Substring(destination.IndexOf((System.Char) ':') + 1));

                            SSH2ForwardingChannel channel = new SSH2ForwardingChannel(SSH2ForwardingChannel.REMOTE_FORWARDING_CHANNEL,
                                                                                      32768,
                                                                                      32768,
                                                                                      hostToConnect,
                                                                                      portToConnect,
                                                                                      address,
                                                                                      port,
                                                                                      originatorIP,
                                                                                      originatorPort,
                                                                                      listener.CreateConnection(hostToConnect, portToConnect, address, port),
                                                                                      false);

                            listener.InitializeTunnel(channel);

                            return(channel);
                        }
                        else
                        {
                            throw new ChannelOpenException("Forwarding had not previously been requested",
                                                           ChannelOpenException.ADMINISTRATIVIVELY_PROHIBITED);
                        }
                    }
                    catch (System.IO.IOException ex)
                    {
                        throw new ChannelOpenException(ex.Message, ChannelOpenException.RESOURCE_SHORTAGE);
                    }
                    catch (SSHException ex)
                    {
                        throw new ChannelOpenException(ex.Message, ChannelOpenException.CONNECT_FAILED);
                    }
                }
                else if (channeltype.Equals("x11"))
                {
                    if (!enclosingInstance.isXForwarding)
                    {
                        throw new ChannelOpenException("X Forwarding had not previously been requested",
                                                       ChannelOpenException.ADMINISTRATIVIVELY_PROHIBITED);
                    }

                    try
                    {
                        ByteBuffer bar = new ByteBuffer(requestdata);

                        System.String originatorIP   = bar.ReadString();
                        int           originatorPort = (int)bar.ReadUINT32();

                        System.String display = enclosingInstance.connection.Context.X11Display;

                        int           i = display.IndexOf(":");
                        System.String targetAddr;
                        int           targetPort;
                        int           displ  = 0;
                        int           screen = 0;
                        String        tmp;

                        if (i != -1)
                        {
                            targetAddr = display.Substring(0, (i) - (0));
                            tmp        = display.Substring(i + 1);
                        }
                        else
                        {
                            targetAddr = "localhost";
                            tmp        = display;
                        }

                        i = tmp.IndexOf(".");
                        if (i != -1)
                        {
                            displ  = Int32.Parse(tmp.Substring(0, i));
                            screen = Int32.Parse(tmp.Substring(i + 1));
                        }
                        else
                        {
                            displ = Int32.Parse(tmp);
                        }

                        targetPort = displ;

                        if (targetPort < 64)
                        {
                            targetPort += 6000;
                        }


                        ForwardingRequestListener listener = enclosingInstance.connection.Context.X11RequestListener;

                        SSH2ForwardingChannel channel = new SSH2ForwardingChannel(SSH2ForwardingChannel.X11_FORWARDING_CHANNEL,
                                                                                  32768,
                                                                                  32768,
                                                                                  targetAddr,
                                                                                  targetPort,
                                                                                  targetAddr,
                                                                                  6000 + displ,
                                                                                  originatorIP,
                                                                                  originatorPort,
                                                                                  listener.CreateConnection(targetAddr, targetPort, originatorIP, originatorPort),
                                                                                  false);

                        listener.InitializeTunnel(channel);

                        return(channel);
                    }
                    catch (System.Exception ex)
                    {
                        throw new ChannelOpenException(ex.Message, ChannelOpenException.CONNECT_FAILED);
                    }
                }

                throw new ChannelOpenException(channeltype + " is not supported", ChannelOpenException.UNKNOWN_CHANNEL_TYPE);
            }