From 45089b6858fff017bad5efaf2769b1b4e8cb2e32 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Mon, 13 Jun 2022 20:26:49 -0300 Subject: [PATCH] docs: example showing how to handle user identity (#54) * docs: example showing how to handle user identity An simple example showing how to handle user identity. Signed-off-by: Carlos A Becker * fix: use ssh.KeysEqual Co-authored-by: Ayman Bagabas --- .gitignore | 3 +- examples/identity/main.go | 67 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 examples/identity/main.go diff --git a/.gitignore b/.gitignore index cbac575..c12c120 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ examples/* !examples/simple +!examples/identity !examples/bubbletea examples/bubbletea/bubbletea examples/bubbletea/.ssh @@ -13,4 +14,4 @@ examples/git/.repos coverage.txt # MacOS specific -.DS_Store \ No newline at end of file +.DS_Store diff --git a/examples/identity/main.go b/examples/identity/main.go new file mode 100644 index 0000000..13c9f17 --- /dev/null +++ b/examples/identity/main.go @@ -0,0 +1,67 @@ +package main + +import ( + "context" + "fmt" + "log" + "os" + "os/signal" + "syscall" + "time" + + "github.com/charmbracelet/wish" + "github.com/charmbracelet/wish/logging" + "github.com/gliderlabs/ssh" +) + +const ( + host = "localhost" + port = 23234 +) + +func main() { + s, err := wish.NewServer( + wish.WithAddress(fmt.Sprintf("%s:%d", host, port)), + wish.WithHostKeyPath(".ssh/term_info_ed25519"), + wish.WithPublicKeyAuth(func(ctx ssh.Context, key ssh.PublicKey) bool { + return true + }), + wish.WithMiddleware( + logging.Middleware(), + func(h ssh.Handler) ssh.Handler { + return func(s ssh.Session) { + carlos, _, _, _, _ := ssh.ParseAuthorizedKey( + []byte("ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILxWe2rXKoiO6W14LYPVfJKzRfJ1f3Jhzxrgjc/D4tU7"), + ) + switch { + case ssh.KeysEqual(s.PublicKey(), carlos): + wish.Println(s, "Hey Carlos!") + default: + wish.Println(s, "Hey, I don't know who you are!") + } + h(s) + } + }, + ), + ) + if err != nil { + log.Fatalln(err) + } + + done := make(chan os.Signal, 1) + signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) + log.Printf("Starting SSH server on %s:%d", host, port) + go func() { + if err = s.ListenAndServe(); err != nil { + log.Fatalln(err) + } + }() + + <-done + log.Println("Stopping SSH server") + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer func() { cancel() }() + if err := s.Shutdown(ctx); err != nil { + log.Fatalln(err) + } +}