sshpiper/plugin/docker/skel.go
Josh Bleecher Snyder 297b8c60e7
extract skel into its own package (#596)
This breaks the dependency of libplugin
on x/crypto, enabling people to use libplugin
without having conflicts over the crypto module.
2025-05-23 12:42:44 -07:00

150 lines
3.1 KiB
Go

//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
}