Eric Bower
·
17 Jun 24
pubkey_auth.go
1package util
2
3import (
4 "log/slog"
5
6 "github.com/charmbracelet/ssh"
7 "github.com/picosh/pico/db"
8 "github.com/picosh/pico/shared"
9)
10
11type SshAuthHandler struct {
12 DBPool db.DB
13 Logger *slog.Logger
14 Cfg *shared.ConfigSite
15}
16
17func NewSshAuthHandler(dbpool db.DB, logger *slog.Logger, cfg *shared.ConfigSite) *SshAuthHandler {
18 return &SshAuthHandler{
19 DBPool: dbpool,
20 Logger: logger,
21 Cfg: cfg,
22 }
23}
24
25func (r *SshAuthHandler) PubkeyAuthHandler(ctx ssh.Context, key ssh.PublicKey) bool {
26 shared.SetPublicKeyCtx(ctx, key)
27
28 pubkey, err := shared.KeyForKeyText(key)
29 if err != nil {
30 return false
31 }
32
33 user, err := r.DBPool.FindUserForKey(ctx.User(), pubkey)
34 if err != nil {
35 r.Logger.Error(
36 "could not find user for key",
37 "key", key,
38 "err", err,
39 )
40 return false
41 }
42
43 if user.Name == "" {
44 r.Logger.Error("username is not set")
45 return false
46 }
47
48 ff, _ := r.DBPool.FindFeatureForUser(user.ID, "plus")
49 // we have free tiers so users might not have a feature flag
50 // in which case we set sane defaults
51 if ff == nil {
52 ff = db.NewFeatureFlag(
53 user.ID,
54 "plus",
55 r.Cfg.MaxSize,
56 r.Cfg.MaxAssetSize,
57 )
58 }
59 // this is jank
60 ff.Data.StorageMax = ff.FindStorageMax(r.Cfg.MaxSize)
61 ff.Data.FileMax = ff.FindFileMax(r.Cfg.MaxAssetSize)
62
63 SetUser(ctx, user)
64 SetFeatureFlag(ctx, ff)
65 return true
66}