getSessionId() 개인적인 메소드

private getSessionId ( ) : byte[]
리턴 byte[]
예제 #1
0
        public override bool start(Session session)
        {
            //super.start(session);

            //Vector identities=JSch.identities;
            System.Collections.ArrayList identities=session.jsch.identities;

            Packet packet=session.packet;
            Buffer buf=session.buf;

            String passphrase=null;
            String username=session.username;

            byte[] _username=null;
            try{ _username= Util.getBytesUTF8( username); }
            catch
            {//(java.io.UnsupportedEncodingException e){
                _username=Util.getBytes(username);
            }

            for(int i=0; i<identities.Count; i++)
            {
                Identity identity=(Identity)(identities[i]);
                byte[] pubkeyblob=identity.getPublicKeyBlob();

                //System.out.println("UserAuthPublicKey: "+identity+" "+pubkeyblob);

                if(pubkeyblob!=null)
                {
                    // send
                    // byte      SSH_MSG_USERAUTH_REQUEST(50)
                    // string    user name
                    // string    service name ("ssh-connection")
                    // string    "publickey"
                    // boolen    FALSE
                    // string    plaintext password (ISO-10646 UTF-8)
                    packet.reset();
                    buf.WriteByte((byte)Session.SSH_MSG_USERAUTH_REQUEST);
                    buf.WriteString(_username);
                    buf.WriteString(Util.getBytes("ssh-connection"));
                    buf.WriteString(Util.getBytes("publickey"));
                    buf.WriteByte((byte)0);
                    buf.WriteString(Util.getBytes(identity.getAlgName()));
                    buf.WriteString(pubkeyblob);
                    session.write(packet);

                loop1:
                    while(true)
                    {
                        // receive
                        // byte      SSH_MSG_USERAUTH_PK_OK(52)
                        // string    service name
                        buf=session.read(buf);
                        //System.out.println("read: 60 ? "+    buf.buffer[5]);
                        if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_PK_OK)
                        {
                            break;
                        }
                        else if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_FAILURE)
                        {
                            //	System.out.println("USERAUTH publickey "+session.getIdentity()+
                            //			   " is not acceptable.");
                            break;
                        }
                        else if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_BANNER)
                        {
                            buf.ReadInt(); buf.ReadByte(); buf.ReadByte();
                            byte[] _message=buf.ReadString();
                            byte[] lang=buf.ReadString();
                            String message=null;
                            try{ message=Util.getStringUTF8(_message); }
                            catch
                            {//(java.io.UnsupportedEncodingException e){
                                message=Util.getString(_message);
                            }
                            if(userinfo!=null)
                            {
                                userinfo.showMessage(message);
                            }
                            goto loop1;
                        }
                        else
                        {
                            //System.out.println("USERAUTH fail ("+buf.buffer[5]+")");
                            //throw new JSchException("USERAUTH fail ("+buf.buffer[5]+")");
                            break;
                        }
                    }
                    if(buf.buffer[5]!=Session.SSH_MSG_USERAUTH_PK_OK)
                    {
                        continue;
                    }
                }

                //System.out.println("UserAuthPublicKey: identity.isEncrypted()="+identity.isEncrypted());

                int count=5;
                while(true)
                {
                    if((identity.isEncrypted() && passphrase==null))
                    {
                        if(userinfo==null) throw new JSchException("USERAUTH fail");
                        if(identity.isEncrypted() &&
                            !userinfo.promptPassphrase("Passphrase for "+identity.getName()))
                        {
                            throw new JSchAuthCancelException("publickey");
                            //throw new JSchException("USERAUTH cancel");
                            //break;
                        }
                        passphrase=userinfo.getPassphrase();
                    }

                    if(!identity.isEncrypted() || passphrase!=null)
                    {
                        //System.out.println("UserAuthPublicKey: @1 "+passphrase);
                        if(identity.setPassphrase(passphrase))
                            break;
                    }
                    passphrase=null;
                    count--;
                    if(count==0)break;
                }

                //System.out.println("UserAuthPublicKey: identity.isEncrypted()="+identity.isEncrypted());

                if(identity.isEncrypted()) continue;
                if(pubkeyblob==null) pubkeyblob=identity.getPublicKeyBlob();

                //System.out.println("UserAuthPublicKey: pubkeyblob="+pubkeyblob);

                if(pubkeyblob==null) continue;

                // send
                // byte      SSH_MSG_USERAUTH_REQUEST(50)
                // string    user name
                // string    service name ("ssh-connection")
                // string    "publickey"
                // boolen    TRUE
                // string    plaintext password (ISO-10646 UTF-8)
                packet.reset();
                buf.WriteByte((byte)Session.SSH_MSG_USERAUTH_REQUEST);
                buf.WriteString(_username);
                buf.WriteString(Util.getBytes("ssh-connection"));
                buf.WriteString(Util.getBytes("publickey"));
                buf.WriteByte((byte)1);
                buf.WriteString(Util.getBytes(identity.getAlgName()));
                buf.WriteString(pubkeyblob);

                //      byte[] tmp=new byte[buf.index-5];
                //      System.arraycopy(buf.buffer, 5, tmp, 0, tmp.length);
                //      buf.putString(signature);

                byte[] sid=session.getSessionId();
                uint sidlen=(uint)sid.Length;
                byte[] tmp=new byte[4+sidlen+buf.index-5];
                tmp[0]=(byte)(sidlen>>24);
                tmp[1]=(byte)(sidlen>>16);
                tmp[2]=(byte)(sidlen>>8);
                tmp[3]=(byte)(sidlen);
                Array.Copy(sid, 0, tmp, 4, sidlen);
                Array.Copy(buf.buffer, 5, tmp, 4+sidlen, buf.index-5);

                byte[] signature=identity.getSignature(session, tmp);
                if(signature==null)
                {  // for example, too long key length.
                    break;
                }
                buf.WriteString(signature);

                session.write(packet);

            loop2:
                while(true)
                {
                    // receive
                    // byte      SSH_MSG_USERAUTH_SUCCESS(52)
                    // string    service name
                    buf=session.read(buf);
                    //System.out.println("read: 52 ? "+    buf.buffer[5]);
                    if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_SUCCESS)
                    {
                        return true;
                    }
                    else if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_BANNER)
                    {
                        buf.ReadInt(); buf.ReadByte(); buf.ReadByte();
                        byte[] _message=buf.ReadString();
                        byte[] lang=buf.ReadString();
                        String message=null;
                        try{ message=Util.getStringUTF8(_message); }
                        catch
                        {//(java.io.UnsupportedEncodingException e){
                            message=Util.getString(_message);
                        }
                        if(userinfo!=null)
                        {
                            userinfo.showMessage(message);
                        }
                        goto loop2;
                    }
                    else if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_FAILURE)
                    {
                        buf.ReadInt(); buf.ReadByte(); buf.ReadByte();
                        byte[] foo=buf.ReadString();
                        int partial_success=buf.ReadByte();
                        //System.out.println(Encoding.UTF8.GetString(foo)+
                        //                   " partial_success:"+(partial_success!=0));
                        if(partial_success!=0)
                        {
                            throw new JSchPartialAuthException(Util.getString(foo));
                        }
                        break;
                    }
                    //System.out.println("USERAUTH fail ("+buf.buffer[5]+")");
                    //throw new JSchException("USERAUTH fail ("+buf.buffer[5]+")");
                    break;
                }
            }
            return false;
        }