forked from urdt/ussd
65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
|
package ssh
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"path"
|
||
|
|
||
|
"golang.org/x/crypto/ssh"
|
||
|
|
||
|
"git.defalsify.org/vise.git/db"
|
||
|
|
||
|
"git.grassecon.net/urdt/ussd/internal/storage"
|
||
|
)
|
||
|
|
||
|
type SshKeyStore struct {
|
||
|
store db.Db
|
||
|
}
|
||
|
|
||
|
func NewSshKeyStore(ctx context.Context, dbDir string) (*SshKeyStore, error) {
|
||
|
keyStore := &SshKeyStore{}
|
||
|
keyStoreFile := path.Join(dbDir, "ssh_authorized_keys.gdbm")
|
||
|
keyStore.store = storage.NewThreadGdbmDb()
|
||
|
err := keyStore.store.Connect(ctx, keyStoreFile)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return keyStore, nil
|
||
|
}
|
||
|
|
||
|
func(s *SshKeyStore) AddFromFile(ctx context.Context, fp string, sessionId string) error {
|
||
|
_, err := os.Stat(fp)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("cannot open ssh server public key file: %v\n", err)
|
||
|
}
|
||
|
|
||
|
publicBytes, err := os.ReadFile(fp)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("Failed to load public key: %v", err)
|
||
|
}
|
||
|
pubKey, _, _, _, err := ssh.ParseAuthorizedKey(publicBytes)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("Failed to parse public key: %v", err)
|
||
|
}
|
||
|
k := append([]byte{0x01}, pubKey.Marshal()...)
|
||
|
s.store.SetPrefix(storage.DATATYPE_CUSTOM)
|
||
|
logg.Infof("Added key", "sessionId", sessionId, "public key", string(publicBytes))
|
||
|
return s.store.Put(ctx, k, []byte(sessionId))
|
||
|
}
|
||
|
|
||
|
func(s *SshKeyStore) Get(ctx context.Context, pubKey ssh.PublicKey) (string, error) {
|
||
|
s.store.SetLanguage(nil)
|
||
|
s.store.SetPrefix(storage.DATATYPE_CUSTOM)
|
||
|
k := append([]byte{0x01}, pubKey.Marshal()...)
|
||
|
v, err := s.store.Get(ctx, k)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
return string(v), nil
|
||
|
}
|
||
|
|
||
|
func(s *SshKeyStore) Close() error {
|
||
|
return s.store.Close()
|
||
|
}
|