MCPcopy
hub / github.com/wavetermdev/waveterm / createHostKeyCallback

Function createHostKeyCallback

pkg/remote/sshclient.go:587–755  ·  view source on GitHub ↗
(ctx context.Context, sshKeywords *wconfig.ConnKeywords)

Source from the content-addressed store, hash-verified

585}
586
587func 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 }

Callers 1

createClientConfigFunction · 0.85

Calls 9

MakeCodedErrorFunction · 0.92
ExpandHomeDirFunction · 0.92
ErrorfFunction · 0.92
PanicHandlerFunction · 0.92
createUnknownKeyVerifierFunction · 0.85
writeToKnownHostsFunction · 0.85
TypeMethod · 0.80
StringMethod · 0.45

Tested by

no test coverage detected