UserAuthKeyboardInteractive.java
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 package com.jcraft.jsch;
00031
00032 class UserAuthKeyboardInteractive extends UserAuth{
00033 public boolean start(Session session) throws Exception{
00034 super.start(session);
00035
00036 if(userinfo!=null && !(userinfo instanceof UIKeyboardInteractive)){
00037 return false;
00038 }
00039
00040 String dest=username+"@"+session.host;
00041 if(session.port!=22){
00042 dest+=(":"+session.port);
00043 }
00044 byte[] password=session.password;
00045
00046 boolean cancel=false;
00047
00048 byte[] _username=null;
00049 _username=Util.str2byte(username);
00050
00051 while(true){
00052
00053
00054
00055
00056
00057
00058
00059 packet.reset();
00060 buf.putByte((byte)SSH_MSG_USERAUTH_REQUEST);
00061 buf.putString(_username);
00062 buf.putString(Util.str2byte("ssh-connection"));
00063
00064 buf.putString(Util.str2byte("keyboard-interactive"));
00065 buf.putString(Util.empty);
00066 buf.putString(Util.empty);
00067 session.write(packet);
00068
00069 boolean firsttime=true;
00070 loop:
00071 while(true){
00072 buf=session.read(buf);
00073 int command=buf.getCommand()&0xff;
00074
00075 if(command==SSH_MSG_USERAUTH_SUCCESS){
00076 return true;
00077 }
00078 if(command==SSH_MSG_USERAUTH_BANNER){
00079 buf.getInt(); buf.getByte(); buf.getByte();
00080 byte[] _message=buf.getString();
00081 byte[] lang=buf.getString();
00082 String message=Util.byte2str(_message);
00083 if(userinfo!=null){
00084 userinfo.showMessage(message);
00085 }
00086 continue loop;
00087 }
00088 if(command==SSH_MSG_USERAUTH_FAILURE){
00089 buf.getInt(); buf.getByte(); buf.getByte();
00090 byte[] foo=buf.getString();
00091 int partial_success=buf.getByte();
00092
00093
00094
00095 if(partial_success!=0){
00096 throw new JSchPartialAuthException(Util.byte2str(foo));
00097 }
00098
00099 if(firsttime){
00100 return false;
00101
00102
00103 }
00104 break;
00105 }
00106 if(command==SSH_MSG_USERAUTH_INFO_REQUEST){
00107 firsttime=false;
00108 buf.getInt(); buf.getByte(); buf.getByte();
00109 String name=Util.byte2str(buf.getString());
00110 String instruction=Util.byte2str(buf.getString());
00111 String languate_tag=Util.byte2str(buf.getString());
00112 int num=buf.getInt();
00113 String[] prompt=new String[num];
00114 boolean[] echo=new boolean[num];
00115 for(int i=0; i<num; i++){
00116 prompt[i]=Util.byte2str(buf.getString());
00117 echo[i]=(buf.getByte()!=0);
00118 }
00119
00120 byte[][] response=null;
00121
00122 if(password!=null &&
00123 prompt.length==1 &&
00124 !echo[0] &&
00125 prompt[0].toLowerCase().startsWith("password:")){
00126 response=new byte[1][];
00127 response[0]=password;
00128 password=null;
00129 }
00130 else if(num>0
00131 ||(name.length()>0 || instruction.length()>0)
00132 ){
00133 if(userinfo!=null){
00134 UIKeyboardInteractive kbi=(UIKeyboardInteractive)userinfo;
00135 String[] _response=kbi.promptKeyboardInteractive(dest,
00136 name,
00137 instruction,
00138 prompt,
00139 echo);
00140 if(_response!=null){
00141 response=new byte[_response.length][];
00142 for(int i=0; i<_response.length; i++){
00143 response[i]=Util.str2byte(_response[i]);
00144 }
00145 }
00146 }
00147 }
00148
00149
00150
00151
00152
00153
00154 packet.reset();
00155 buf.putByte((byte)SSH_MSG_USERAUTH_INFO_RESPONSE);
00156 if(num>0 &&
00157 (response==null ||
00158 num!=response.length)){
00159
00160 if(response==null){
00161
00162 buf.putInt(num);
00163 for(int i=0; i<num; i++){
00164 buf.putString(Util.empty);
00165 }
00166 }
00167 else{
00168 buf.putInt(0);
00169 }
00170
00171 if(response==null)
00172 cancel=true;
00173 }
00174 else{
00175 buf.putInt(num);
00176 for(int i=0; i<num; i++){
00177 buf.putString(response[i]);
00178 }
00179 }
00180 session.write(packet);
00181
00182
00183
00184
00185 continue loop;
00186 }
00187
00188 return false;
00189 }
00190 if(cancel){
00191 throw new JSchAuthCancelException("keyboard-interactive");
00192
00193 }
00194 }
00195
00196 }
00197 }