KnownHosts.cs
上传用户:szltgg
上传日期:2019-05-16
资源大小:604k
文件大小:3k
源码类别:

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: KnownHosts.cs,v 1.2 2005/04/20 08:45:45 okajima Exp $
  4. */
  5. using System;
  6. using System.Collections;
  7. using System.IO;
  8. using Poderosa.ConnectionParam;
  9. using Poderosa.SSH;
  10. namespace Poderosa.Config
  11. {
  12. /// <summary>
  13. /// known_hosts偺堦棗傪娗棟偡傞丅
  14. /// </summary>
  15. public abstract class KnownHosts {
  16. protected string _fileName;
  17. public abstract void Load(string filename);
  18. public abstract void Clear();
  19. public abstract void WriteTo(string filename);
  20. protected static void WriteEntry(StreamWriter w, string host, string key_expr) {
  21. w.Write(host);
  22. w.Write(' ');
  23. w.WriteLine(key_expr);
  24. }
  25. }
  26. public class SSHKnownHosts : KnownHosts, ISSHKnownHosts {
  27. private Hashtable _dataForSSH1; //host偐傜僄儞僩儕傊偺儅僢僾
  28. private Hashtable _dataForSSH2;
  29. public SSHKnownHosts() {
  30. _dataForSSH1 = new Hashtable();
  31. _dataForSSH2 = new Hashtable();
  32. }
  33. public override void Clear() {
  34. _dataForSSH1 = new Hashtable();
  35. _dataForSSH2 = new Hashtable();
  36. }
  37. public override void Load(string filename) {
  38. _fileName = filename;
  39. _dataForSSH1.Clear();
  40. _dataForSSH2.Clear();
  41. StreamReader r = null;
  42. try {
  43. r = new StreamReader(File.Open(filename, FileMode.Open, FileAccess.Read));
  44. string line = r.ReadLine();
  45. while(line!=null) {
  46. int sp = line.IndexOf(' ');
  47. if(sp==-1) throw new IOException("known_hosts is corrupted: host name field is not found");
  48. string body = line.Substring(sp+1);
  49. if(body.StartsWith("ssh1"))
  50. _dataForSSH1[line.Substring(0, sp)] = body;
  51. else
  52. _dataForSSH2[line.Substring(0, sp)] = body;
  53. line = r.ReadLine();
  54. }
  55. }
  56. finally {
  57. if(r!=null) r.Close();
  58. }
  59. }
  60. public void Update(SSHTerminalParam param, string key) {
  61. if(param.Method==ConnectionMethod.SSH1)
  62. _dataForSSH1[ToKeyString(param)] = key;
  63. else
  64. _dataForSSH2[ToKeyString(param)] = key;
  65. }
  66. public KeyCheckResult Check(SSHTerminalParam param, string key) {
  67. object k = param.Method==ConnectionMethod.SSH1? _dataForSSH1[ToKeyString(param)] : _dataForSSH2[ToKeyString(param)];
  68. if(k==null)
  69. return KeyCheckResult.NotExists;
  70. else
  71. return key.Equals(k)? KeyCheckResult.OK : KeyCheckResult.Different;
  72. }
  73. public override void WriteTo(string filename) {
  74. if(_dataForSSH1.Count==0 && _dataForSSH2.Count==0) return;
  75. StreamWriter w = null;
  76. try {
  77. w = new StreamWriter(File.Open(filename, FileMode.Create));
  78. IDictionaryEnumerator ie = _dataForSSH1.GetEnumerator();
  79. while(ie.MoveNext())
  80. WriteEntry(w, (string)ie.Key, (string)ie.Value);
  81. ie = _dataForSSH2.GetEnumerator();
  82. while(ie.MoveNext())
  83. WriteEntry(w, (string)ie.Key, (string)ie.Value);
  84. }
  85. finally {
  86. if(w!=null) w.Close();
  87. }
  88. }
  89. private static string ToKeyString(SSHTerminalParam param) {
  90. string h = param.Host;
  91. if(param.Port!=22) h += ":" + param.Port;
  92. return h;
  93. }
  94. }
  95. }