public override void add(String host, byte[] key, UserInfo userinfo) { HostKey hk; int type=getType(key); for(int i=0; i<pool.Count; i++) { hk=(HostKey)(pool[i]); if(isIncluded(hk.host, host) && hk.type==type) { /* if(Util.array_equals(hk.key, key)){ return; } if(hk.host.equals(host)){ hk.key=key; return; } else{ hk.host=deleteSubString(hk.host, host); break; } */ } } hk=new HostKey(host, type, key); pool.Add(hk); String bar=getKnownHostsRepositoryID(); if(userinfo!=null && bar!=null) { bool foo=true; FileInfo goo=new FileInfo(bar); if(!goo.Exists) { foo=false; if(userinfo!=null) { foo=userinfo.promptYesNo( bar+" does not exist.\n"+ "Are you sure you want to create it?" ); DirectoryInfo dir =goo.Directory; if(foo && dir!=null && !dir.Exists) { foo=userinfo.promptYesNo( "The parent directory "+dir.Name+" does not exist.\n"+ "Are you sure you want to create it?" ); if(foo) { try{dir.Create(); userinfo.showMessage(dir.Name+" has been succesfully created.\nPlease check its access permission.");} catch { userinfo.showMessage(dir.Name+" has not been created."); foo=false; } } } if(goo==null)foo=false; } } if(foo) { try { sync(bar); } catch(Exception e){ Console.WriteLine("sync known_hosts: "+e); } } } }
private void addInvalidLine(String line) { HostKey hk = new HostKey(line, HostKey.UNKNOWN, null); pool.Add(hk); }
public override HostKey[] getHostKey(String host, String type) { lock(pool) { int count=0; for(int i=0; i<pool.Count; i++) { HostKey hk=(HostKey)pool[i]; if(hk.type==HostKey.UNKNOWN) continue; if(host==null || (isIncluded(hk.host, host) && (type==null || hk.getType().Equals(type)))) { count++; } } if(count==0)return null; HostKey[] foo=new HostKey[count]; int j=0; for(int i=0; i<pool.Count; i++) { HostKey hk=(HostKey)pool[i]; if(hk.type==HostKey.UNKNOWN) continue; if(host==null || (isIncluded(hk.host, host) && (type==null || hk.getType().Equals(type)))) { foo[j++]=hk; } } return foo; } }
internal void setKnownHosts(StreamReader foo) { pool.Clear(); System.Text.StringBuilder sb=new System.Text.StringBuilder(); byte i; int j; bool error=false; try { StreamReader fis=foo; String host; String key=null; int type; byte[] buf=new byte[1024]; int bufl=0; loop: while(true) { bufl=0; while(true) { j=fis.Read(); if(j==-1){ goto break_loop;} if(j==0x0d){ continue; } if(j==0x0a){ break; } buf[bufl++]=(byte)j; } j=0; while(j<bufl) { i=buf[j]; if(i==' '||i=='\t'){ j++; continue; } if(i=='#') { addInvalidLine(System.Text.Encoding.Default.GetString(buf, 0, bufl)); goto loop; } break; } if(j>=bufl) { addInvalidLine(System.Text.Encoding.Default.GetString(buf, 0, bufl)); goto loop; } sb.Length = 0; while(j<bufl) { i=buf[j++]; if(i==0x20 || i=='\t'){ break; } sb.Append((char)i); } host=sb.ToString(); if(j>=bufl || host.Length==0) { addInvalidLine(System.Text.Encoding.Default.GetString(buf, 0, bufl)); goto loop; } sb.Length=0; type=-1; while(j<bufl) { i=buf[j++]; if(i==0x20 || i=='\t'){ break; } sb.Append((char)i); } if(sb.ToString().Equals("ssh-dss")){ type=HostKey.SSHDSS; } else if(sb.ToString().Equals("ssh-rsa")){ type=HostKey.SSHRSA; } else { j=bufl; } if(j>=bufl) { addInvalidLine(Util.getString(buf, 0, bufl)); goto loop; } sb.Length=0; while(j<bufl) { i=buf[j++]; if(i==0x0d){ continue; } if(i==0x0a){ break; } sb.Append((char)i); } key=sb.ToString(); if(key.Length==0) { addInvalidLine(Util.getString(buf, 0, bufl)); goto loop; } //System.out.println(host); //System.out.println("|"+key+"|"); HostKey hk = new HostKey(host, type, Util.fromBase64(Util.getBytes(key), 0, key.Length)); pool.Add(hk); } break_loop: fis.Close(); if(error) { throw new JSchException("KnownHosts: invalid format"); } } catch(Exception e) { if(e is JSchException) { throw (JSchException)e; } throw new JSchException(e.ToString()); } }
private void checkHost(String host, KeyExchange kex) { String shkc=getConfig("StrictHostKeyChecking"); //System.Console.WriteLine("shkc: "+shkc); byte[] K_S=kex.getHostKey(); String key_type=kex.getKeyType(); String key_fprint=kex.getFingerPrint(); hostkey=new HostKey(host, K_S); HostKeyRepository hkr=jsch.getHostKeyRepository(); int i=0; lock(hkr) { i=hkr.check(host, K_S); } bool insert=false; if((shkc.equals("ask") || shkc.equals("yes")) && i==HostKeyRepository.CHANGED) { String file=null; lock(hkr) { file=hkr.getKnownHostsRepositoryID(); } if(file==null){file="known_hosts";} String message= "WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!\n"+ "IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!\n"+ "Someone could be eavesdropping on you right now (man-in-the-middle attack)!\n"+ "It is also possible that the "+key_type+" host key has just been changed.\n"+ "The fingerprint for the "+key_type+" key sent by the remote host is\n"+ key_fprint+".\n"+ "Please contact your system administrator.\n"+ "Add correct host key in "+file+" to get rid of this message."; bool b=false; if(userinfo!=null) { //userinfo.showMessage(message); b=userinfo.promptYesNo(message+ "\nDo you want to delete the old key and insert the new key?"); } //throw new JSchException("HostKey has been changed: "+host); if(!b) { throw new JSchException("HostKey has been changed: "+host); } else { lock(hkr) { hkr.remove(host, (key_type.equals("DSA") ? "ssh-dss" : "ssh-rsa"), null); insert=true; } } } // bool insert=false; if((shkc.equals("ask") || shkc.equals("yes")) && (i!=HostKeyRepository.OK) && !insert) { if(shkc.equals("yes")) { throw new JSchException("reject HostKey: "+host); } //System.Console.WriteLine("finger-print: "+key_fprint); if(userinfo!=null) { bool foo=userinfo.promptYesNo( "The authenticity of host '"+host+"' can't be established.\n"+ key_type+" key fingerprint is "+key_fprint+".\n"+ "Are you sure you want to continue connecting?" ); if(!foo) { throw new JSchException("reject HostKey: "+host); } insert=true; } else { if(i==HostKeyRepository.NOT_INCLUDED) throw new JSchException("UnknownHostKey: "+host+". "+key_type+" key fingerprint is "+key_fprint); else throw new JSchException("HostKey has been changed: "+host); } } if(shkc.equals("no") && HostKeyRepository.NOT_INCLUDED==i) { insert=true; } if(insert) { lock(hkr) { hkr.add(host, K_S, userinfo); } } }