public override void remove(String host, String type, byte[] key) { bool _sync = false; for (int i = 0; i < pool.Count; i++) { HostKey hk = (HostKey)(pool[i]); if (host == null || (hk.getHost().Equals(host) && (type == null || (hk.getType().Equals(type) && (key == null || Util.array_equals(key, hk.key)))))) { pool.Remove(hk); _sync = true; } } if (_sync) { try { sync(); } catch { } ; } }
public override HostKey[] getHostKey(String host, String type) { lock (pool) { int count = 0; for (int i = 0; i < pool.Count; i++) { var 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); } var foo = new HostKey[count]; int j = 0; for (int i = 0; i < pool.Count; i++) { var 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(); var sb = new StringBuilder(); byte i; int j; bool error = false; try { StreamReader fis = foo; String host; String key = null; int type; var 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(Encoding.Default.GetString(buf, 0, bufl)); goto loop; } break; } if (j >= bufl) { addInvalidLine(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(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+"|"); var 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 e; } throw new JSchException(e.ToString()); } }
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; var 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) { var hk = new HostKey(line, HostKey.UNKNOWN, null); pool.Add(hk); }
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()); } }
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; } }
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); }
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); } } }