repos / pico

pico services - prose.sh, pastes.sh, imgs.sh, feeds.sh, pgs.sh
git clone https://github.com/picosh/pico.git

pico / filehandlers / util
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}