//go:build full || e2e package main import ( "encoding/base64" "github.com/tg123/sshpiper/libplugin" "github.com/tg123/sshpiper/libplugin/skel" ) type skelpipeWrapper struct { plugin *plugin pipe *pipe } type skelpipeFromWrapper struct { skelpipeWrapper } type skelpipePasswordWrapper struct { skelpipeFromWrapper } type skelpipePublicKeyWrapper struct { skelpipeFromWrapper } type skelpipeToWrapper struct { skelpipeWrapper username string } type skelpipeToPasswordWrapper struct { skelpipeToWrapper } type skelpipeToPrivateKeyWrapper struct { skelpipeToWrapper } func (s *skelpipeWrapper) From() []skel.SkelPipeFrom { w := skelpipeFromWrapper{ skelpipeWrapper: *s, } if s.pipe.PrivateKey != "" || s.pipe.AuthorizedKeys != "" { return []skel.SkelPipeFrom{&skelpipePublicKeyWrapper{ skelpipeFromWrapper: w, }} } else { return []skel.SkelPipeFrom{&skelpipePasswordWrapper{ skelpipeFromWrapper: w, }} } } func (s *skelpipeToWrapper) User(conn libplugin.ConnMetadata) string { return s.username } func (s *skelpipeToWrapper) Host(conn libplugin.ConnMetadata) string { return s.pipe.Host } func (s *skelpipeToWrapper) IgnoreHostKey(conn libplugin.ConnMetadata) bool { return true // TODO support this } func (s *skelpipeToWrapper) KnownHosts(conn libplugin.ConnMetadata) ([]byte, error) { return nil, nil // TODO support this } func (s *skelpipeFromWrapper) MatchConn(conn libplugin.ConnMetadata) (skel.SkelPipeTo, error) { user := conn.User() matched := s.pipe.ClientUsername == user || s.pipe.ClientUsername == "" targetuser := s.pipe.ContainerUsername if targetuser == "" { targetuser = user } if matched { if s.pipe.PrivateKey != "" { return &skelpipeToPrivateKeyWrapper{ skelpipeToWrapper: skelpipeToWrapper{ skelpipeWrapper: s.skelpipeWrapper, username: targetuser, }, }, nil } return &skelpipeToPasswordWrapper{ skelpipeToWrapper: skelpipeToWrapper{ skelpipeWrapper: s.skelpipeWrapper, username: targetuser, }, }, nil } return nil, nil } func (s *skelpipePasswordWrapper) TestPassword(conn libplugin.ConnMetadata, password []byte) (bool, error) { return true, nil // do not test input password } func (s *skelpipePublicKeyWrapper) AuthorizedKeys(conn libplugin.ConnMetadata) ([]byte, error) { return base64.StdEncoding.DecodeString(s.pipe.AuthorizedKeys) } func (s *skelpipePublicKeyWrapper) TrustedUserCAKeys(conn libplugin.ConnMetadata) ([]byte, error) { return nil, nil // TODO support this } func (s *skelpipeToPrivateKeyWrapper) PrivateKey(conn libplugin.ConnMetadata) ([]byte, []byte, error) { k, err := base64.StdEncoding.DecodeString(s.pipe.PrivateKey) if err != nil { return nil, nil, err } return k, nil, nil } func (s *skelpipeToPasswordWrapper) OverridePassword(conn libplugin.ConnMetadata) ([]byte, error) { return nil, nil } func (p *plugin) listPipe(_ libplugin.ConnMetadata) ([]skel.SkelPipe, error) { dpipes, err := p.list() if err != nil { return nil, err } var pipes []skel.SkelPipe for _, pipe := range dpipes { wrapper := &skelpipeWrapper{ plugin: p, pipe: &pipe, } pipes = append(pipes, wrapper) } return pipes, nil }