* introduce plugin skel to reuse code * Refactor code to use libplugin.NewSkelPlugin for plugin/kubernetes/main.go Add YAML Plugin skel.go for plugin/yaml * Fix code scanning alert no. 6: Incorrect conversion between integer types Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> * fix gpt * fjx password handling in SkelPlugin and skelpipeToWrapper * go fmt * Refactor Docker plugin to use skelpipe wrapper * Refactor skel.go to use container username instead of client username * revert yaml test order * fix public and password mess up * Refactor working dir to use skel * revert deleted file * Refactor skel.go to remove unused code and simplify MatchConn function * Refactor skel.go to read userKnownHosts file in KnownHosts function * remove workingdirbykey from goreleaser * Refactor workingdir.go to use libplugin.SplitHostPortForSSH for parsing host and port * Refactor skel.go to remove unused code and simplify MatchConn function * merge doc into workingdir --------- Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
130 lines
2.7 KiB
Go
130 lines
2.7 KiB
Go
//go:build full || e2e
|
|
|
|
package main
|
|
|
|
import (
|
|
"encoding/base64"
|
|
|
|
"github.com/tg123/sshpiper/libplugin"
|
|
)
|
|
|
|
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
|
|
}
|
|
|
|
func (s *skelpipeWrapper) From() []libplugin.SkelPipeFrom {
|
|
|
|
w := skelpipeFromWrapper{
|
|
skelpipeWrapper: *s,
|
|
}
|
|
|
|
if s.pipe.PrivateKey != "" || s.pipe.AuthorizedKeys != "" {
|
|
return []libplugin.SkelPipeFrom{&skelpipePublicKeyWrapper{
|
|
skelpipeFromWrapper: w,
|
|
}}
|
|
} else {
|
|
return []libplugin.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) (libplugin.SkelPipeTo, error) {
|
|
user := conn.User()
|
|
|
|
matched := s.pipe.ClientUsername == user || s.pipe.ClientUsername == ""
|
|
targetuser := s.pipe.ContainerUsername
|
|
|
|
if targetuser == "" {
|
|
targetuser = user
|
|
}
|
|
|
|
if matched {
|
|
return &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 *skelpipeToWrapper) 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 *skelpipeToWrapper) OverridePassword(conn libplugin.ConnMetadata) ([]byte, error) {
|
|
return nil, nil
|
|
}
|
|
|
|
func (p *plugin) listPipe(_ libplugin.ConnMetadata) ([]libplugin.SkelPipe, error) {
|
|
dpipes, err := p.list()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var pipes []libplugin.SkelPipe
|
|
for _, pipe := range dpipes {
|
|
wrapper := &skelpipeWrapper{
|
|
plugin: p,
|
|
pipe: &pipe,
|
|
}
|
|
pipes = append(pipes, wrapper)
|
|
|
|
}
|
|
|
|
return pipes, nil
|
|
}
|