Skip to content

Commit

Permalink
ssh-server: Use hash of public key for config file path
Browse files Browse the repository at this point in the history
  • Loading branch information
miguelmota committed Dec 17, 2020
1 parent 8ea39c0 commit b699f1d
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 17 deletions.
6 changes: 6 additions & 0 deletions README.md
Expand Up @@ -27,6 +27,12 @@ The interface is inspired by [`htop`](https://en.wikipedia.org/wiki/Htop) and sh

<img src="https://user-images.githubusercontent.com/168240/41806841-043c0ca6-767a-11e8-9c51-df9fc64b3b5c.png" alt="currency convert menu" width="880" />

## Demo

```bash
ssh cointop.sh
```

In action

<img src="https://user-images.githubusercontent.com/168240/39569570-75b1547c-4e7a-11e8-8eac-552abaa431f0.gif" alt="screencast" width="880" />
Expand Down
51 changes: 34 additions & 17 deletions pkg/ssh/server.go
Expand Up @@ -4,6 +4,7 @@ package ssh

import (
"context"
"crypto/sha256"
"errors"
"fmt"
"io"
Expand All @@ -20,10 +21,10 @@ import (
gossh "golang.org/x/crypto/ssh"
)

// DefaultHostKeyFile ...
// DefaultHostKeyFile is default SSH key path
var DefaultHostKeyFile = "~/.ssh/id_rsa"

// Config ...
// Config is config struct
type Config struct {
Port uint
Address string
Expand All @@ -32,7 +33,7 @@ type Config struct {
HostKeyFile string
}

// Server ...
// Server is server struct
type Server struct {
port uint
address string
Expand All @@ -42,7 +43,7 @@ type Server struct {
hostKeyFile string
}

// NewServer ...
// NewServer returns a new server instance
func NewServer(config *Config) *Server {
hostKeyFile := DefaultHostKeyFile
if config.HostKeyFile != "" {
Expand All @@ -60,7 +61,7 @@ func NewServer(config *Config) *Server {
}
}

// ListenAndServe ...
// ListenAndServe starts the server
func (s *Server) ListenAndServe() error {
s.sshServer = &ssh.Server{
Addr: fmt.Sprintf("%s:%v", s.address, s.port),
Expand All @@ -74,13 +75,32 @@ func (s *Server) ListenAndServe() error {
return
}

tempDir, err := createTempDir()
if err != nil {
fmt.Println(err)
return
configDir := ""
pubKey := sshSession.PublicKey()
if pubKey != nil {
pubBytes := pubKey.Marshal()
if len(pubBytes) > 0 {
hash := sha256.Sum256(pubBytes)
configDir = fmt.Sprintf("/tmp/cointop_config/%x", hash)
err := os.MkdirAll(configDir, 0700)
if err != nil {
fmt.Println(err)
return
}
}
}

if configDir == "" {
tempDir, err := createTempDir()
if err != nil {
fmt.Println(err)
return
}
configDir = tempDir
defer os.RemoveAll(configDir)
}

configPath := fmt.Sprintf("%s/config", tempDir)
configPath := fmt.Sprintf("%s/config", configDir)
colorsDir := pathutil.NormalizePath("~/.config/cointop/colors")

cmdCtx, cancelCmd := context.WithCancel(sshSession.Context())
Expand All @@ -90,7 +110,7 @@ func (s *Server) ListenAndServe() error {
"--reset",
"--silent",
"--cache-dir",
tempDir,
configDir,
"--config",
configPath,
"--colors-dir",
Expand Down Expand Up @@ -128,10 +148,8 @@ func (s *Server) ListenAndServe() error {
io.Copy(sshSession, f)
f.Close()
cmd.Wait()
os.Remove(configPath)
},
PtyCallback: func(ctx ssh.Context, pty ssh.Pty) bool {
// TODO: check public key hash
return true
},
PublicKeyHandler: func(ctx ssh.Context, key ssh.PublicKey) bool {
Expand All @@ -157,19 +175,18 @@ func (s *Server) ListenAndServe() error {
return s.sshServer.ListenAndServe()
}

// Shutdown ...
// Shutdown shuts down the server
func (s *Server) Shutdown() {
s.sshServer.Close()
}

// setWinsize ...
// setWinsize sets the PTY window size
func setWinsize(f *os.File, w, h int) {
syscall.Syscall(syscall.SYS_IOCTL, f.Fd(), uintptr(syscall.TIOCSWINSZ),
uintptr(unsafe.Pointer(&struct{ h, w, x, y uint16 }{uint16(h), uint16(w), 0, 0})))
}

// createTempDir ...
// TODO: load saved configuration based on ssh public key hash
// createTempDir creates a temporary directory
func createTempDir() (string, error) {
return ioutil.TempDir("", "")
}

0 comments on commit b699f1d

Please sign in to comment.