Пример #1
0
		public override void start() 
		{
			try
			{
				PipedOutputStream pos=new PipedOutputStream();
				io.setOutputStream(pos);
				//      PipedInputStream pis=new PipedInputStream(pos);
				PipedInputStream pis=new MyPipedInputStream(pos, 32*1024);
				io.setInputStream(pis);

				Request request=new RequestSftp();
				request.request(session, this);

				//    thread=Thread.currentThread();

				//      buf=new Buffer();
				buf=new Buffer(rmpsize);
				packet=new Packet(buf);
				int i=0;
				int j=0;
				int length;
				int type;
				byte[] str;

				// send SSH_FXP_INIT
				sendINIT();

				// receive SSH_FXP_VERSION
				buf.rewind();
				i=io.ins.Read(buf.buffer, 0, buf.buffer.Length);
				//System.out.println(io+" "+io.ins+" "+io.out);
				length=buf.getInt();
				type=buf.getByte();           // 2 -> SSH_FXP_VERSION
				server_version=buf.getInt();
				//System.out.println("SFTP protocol server-version="+server_version);

				// send SSH_FXP_REALPATH
				sendREALPATH(Util.getBytes("."));

				// receive SSH_FXP_NAME
				buf.rewind();
				i=io.ins.Read(buf.buffer, 0, buf.buffer.Length);
				length=buf.getInt();
				type=buf.getByte();          // 104 -> SSH_FXP_NAME
				buf.getInt();                //
				i=buf.getInt();              // count
				str=buf.getString();         // filename
				home=cwd=Util.getString(str);
				str=buf.getString();         // logname
				//    SftpATTRS.getATTR(buf);           // attrs

				lcwd=Path.GetFullPath(".");

				//thread=new Thread(this);
				//thread.setName("Sftp for "+session.host);
				//thread.start();
			}
			catch(Exception e)
			{
				//System.out.println(e);
				if(e is JSchException) throw (JSchException)e;
				throw new JSchException(e.ToString());
			}
		}
Пример #2
0
        public Buffer read(Buffer buf)
        {
            int j=0;
            while(true)
            {
                buf.reset();
                io.getByte(buf.buffer, buf.index, cipher_size); buf.index+=cipher_size;
                if(s2ccipher!=null)
                {
                    s2ccipher.update(buf.buffer, 0, cipher_size, buf.buffer, 0);
                }
            //				j=((buf.buffer[0]<<24)&0xff000000)|
            //					((buf.buffer[1]<<16)&0x00ff0000)|
            //					((buf.buffer[2]<< 8)&0x0000ff00)|
            //					((buf.buffer[3]    )&0x000000ff);
                j=Util.ToInt32( buf.buffer, 0 );
                j=j-4-cipher_size+8;
                if(j>0)
                {
                    io.getByte(buf.buffer, buf.index, j); buf.index+=(j);
                    if(s2ccipher!=null)
                    {
                        s2ccipher.update(buf.buffer, cipher_size, j, buf.buffer, cipher_size);
                    }
                }
                /*
                io.getByte(buf.buffer, buf.index, 8); buf.index+=8;
                if(s2ccipher!=null){
                  s2ccipher.update(buf.buffer, 0, 8, buf.buffer, 0);
                }
                j=((buf.buffer[0]<<24)&0xff000000)|
                  ((buf.buffer[1]<<16)&0x00ff0000)|
                  ((buf.buffer[2]<< 8)&0x0000ff00)|
                  ((buf.buffer[3]    )&0x000000ff);
                io.getByte(buf.buffer, buf.index, j-4); buf.index+=(j-4);
                if(s2ccipher!=null){
                  s2ccipher.update(buf.buffer, 8, j-4, buf.buffer, 8);
                }
                */

                if(s2cmac!=null)
                {
                    s2cmac.update(seqi);
                    s2cmac.update(buf.buffer, 0, buf.index);
                    byte[] result=s2cmac.doFinal();
                    io.getByte(mac_buf, 0, mac_buf.Length);
                    if(!Arrays.equals(result, mac_buf))
                    {
                        System.Console.WriteLine("mac error");
                        throw new IOException("MAC Error");
                    }
                }
                seqi++;

                if(inflater!=null)
                {
                    //inflater.uncompress(buf);
                    int pad=buf.buffer[4];
                    uncompress_len[0]=buf.index-5-pad;
                    byte[] foo=inflater.uncompress(buf.buffer, 5, uncompress_len);
                    if(foo!=null)
                    {
                        buf.buffer=foo;
                        buf.index=5+uncompress_len[0];
                    }
                    else
                    {
                        System.Console.Error.WriteLine("fail in inflater");
                        break;
                    }
                }

                int type=buf.buffer[5]&0xff;
                //System.Console.WriteLine("read: "+type);
                if(type==SSH_MSG_DISCONNECT)
                {
                    buf.rewind();
                    buf.getInt();buf.getShort();
                    int reason_code=buf.getInt();
                    byte[] description=buf.getString();
                    byte[] language_tag=buf.getString();
                    /*
                        System.Console.Error.WriteLine("SSH_MSG_DISCONNECT:"+
                                               " "+reason_code+
                                   " "+new String(description)+
                                   " "+new String(language_tag));
                    */
                    throw new JSchException("SSH_MSG_DISCONNECT:"+
                        " "+reason_code+
                        " "+new String(description)+
                        " "+new String(language_tag));
                    //break;
                }
                else if(type==SSH_MSG_IGNORE)
                {
                }
                else if(type==SSH_MSG_DEBUG)
                {
                    buf.rewind();
                    buf.getInt();buf.getShort();
                    /*
                        byte always_display=(byte)buf.getByte();
                        byte[] message=buf.getString();
                        byte[] language_tag=buf.getString();
                        System.Console.Error.WriteLine("SSH_MSG_DEBUG:"+
                                   " "+new String(message)+
                                   " "+new String(language_tag));
                    */
                }
                else if(type==SSH_MSG_CHANNEL_WINDOW_ADJUST)
                {
                    buf.rewind();
                    buf.getInt();buf.getShort();
                    Channel c=Channel.getChannel(buf.getInt(), this);
                    if(c==null)
                    {
                    }
                    else
                    {
                        c.addRemoteWindowSize(buf.getInt());
                    }
                }
                else
                {
                    break;
                }
            }
            buf.rewind();
            return buf;
        }