(ctx context.Context, sshKeywords *wconfig.ConnKeywords)
| 585 | } |
| 586 | |
| 587 | func createHostKeyCallback(ctx context.Context, sshKeywords *wconfig.ConnKeywords) (ssh.HostKeyCallback, HostKeyAlgorithms, error) { |
| 588 | globalKnownHostsFiles := sshKeywords.SshGlobalKnownHostsFile |
| 589 | userKnownHostsFiles := sshKeywords.SshUserKnownHostsFile |
| 590 | |
| 591 | osUser, err := user.Current() |
| 592 | if err != nil { |
| 593 | return nil, nil, utilds.MakeCodedError(ConnErrCode_ConfigParse, err) |
| 594 | } |
| 595 | var unexpandedKnownHostsFiles []string |
| 596 | if osUser.Username == "root" { |
| 597 | unexpandedKnownHostsFiles = globalKnownHostsFiles |
| 598 | } else { |
| 599 | unexpandedKnownHostsFiles = append(userKnownHostsFiles, globalKnownHostsFiles...) |
| 600 | } |
| 601 | |
| 602 | var knownHostsFiles []string |
| 603 | for _, filename := range unexpandedKnownHostsFiles { |
| 604 | filePath, err := wavebase.ExpandHomeDir(filename) |
| 605 | if err != nil { |
| 606 | continue |
| 607 | } |
| 608 | knownHostsFiles = append(knownHostsFiles, filePath) |
| 609 | } |
| 610 | |
| 611 | // there are no good known hosts files |
| 612 | if len(knownHostsFiles) == 0 { |
| 613 | return nil, nil, utilds.Errorf(ConnErrCode_KnownHostsNone, "no known_hosts files provided by ssh. defaults are overridden") |
| 614 | } |
| 615 | |
| 616 | var unreadableFiles []string |
| 617 | |
| 618 | // the library we use isn't very forgiving about files that are formatted |
| 619 | // incorrectly. if a problem file is found, it is removed from our list |
| 620 | // and we try again |
| 621 | var basicCallback ssh.HostKeyCallback |
| 622 | var hostKeyAlgorithms HostKeyAlgorithms |
| 623 | for basicCallback == nil && len(knownHostsFiles) > 0 { |
| 624 | keyDb, err := knownhosts.NewDB(knownHostsFiles...) |
| 625 | if serr, ok := err.(*os.PathError); ok { |
| 626 | badFile := serr.Path |
| 627 | unreadableFiles = append(unreadableFiles, badFile) |
| 628 | var okFiles []string |
| 629 | for _, filename := range knownHostsFiles { |
| 630 | if filename != badFile { |
| 631 | okFiles = append(okFiles, filename) |
| 632 | } |
| 633 | } |
| 634 | if len(okFiles) >= len(knownHostsFiles) { |
| 635 | return nil, nil, utilds.Errorf(ConnErrCode_KnownHostsFmt, "problem file (%s) doesn't exist. this should not be possible", badFile) |
| 636 | } |
| 637 | knownHostsFiles = okFiles |
| 638 | } else if err != nil { |
| 639 | return nil, nil, utilds.Errorf(ConnErrCode_KnownHostsFmt, "known_hosts formatting error: %w", err) |
| 640 | } else { |
| 641 | basicCallback = keyDb.HostKeyCallback() |
| 642 | hostKeyAlgorithms = keyDb.HostKeyAlgorithms |
| 643 | } |
| 644 | } |
no test coverage detected