1package config
2
3import (
4 "log"
5
6 gm "github.com/charmbracelet/wish/git"
7 "github.com/gliderlabs/ssh"
8)
9
10func (cfg *Config) Push(repo string, pk ssh.PublicKey) {
11 log.Printf("git push: %s", repo)
12 err := cfg.reload()
13 if err != nil {
14 log.Printf("error reloading after push: %s", err)
15 }
16 if cfg.Stats != nil {
17 cfg.Stats.Push()
18 }
19}
20
21func (cfg *Config) Fetch(repo string, pk ssh.PublicKey) {
22 log.Printf("git fetch: %s", repo)
23 if cfg.Stats != nil {
24 cfg.Stats.Fetch()
25 }
26}
27
28func (cfg *Config) AuthRepo(repo string, pk ssh.PublicKey) gm.AccessLevel {
29 return cfg.accessForKey(repo, pk)
30}
31
32func (cfg *Config) PasswordHandler(ctx ssh.Context, password string) bool {
33 return (cfg.AnonAccess != "no-access") && cfg.AllowKeyless
34}
35
36func (cfg *Config) PublicKeyHandler(ctx ssh.Context, pk ssh.PublicKey) bool {
37 return cfg.accessForKey("", pk) == gm.NoAccess
38}
39
40func (cfg *Config) accessForKey(repo string, pk ssh.PublicKey) gm.AccessLevel {
41 private := cfg.isPrivate(repo)
42 if repo == "config" {
43 private = true
44 }
45 for _, u := range cfg.Users {
46 apk, _, _, _, err := ssh.ParseAuthorizedKey([]byte(u.PublicKey))
47 if err != nil {
48 log.Printf("error: malformed authorized key: '%s'", u.PublicKey)
49 return gm.NoAccess
50 }
51 if ssh.KeysEqual(pk, apk) {
52 if u.Admin {
53 return gm.AdminAccess
54 }
55 for _, r := range u.CollabRepos {
56 if repo == r {
57 return gm.ReadWriteAccess
58 }
59 }
60 if !private {
61 return gm.ReadOnlyAccess
62 }
63 }
64 }
65 if private && (cfg.AnonAccess != "read-write") {
66 return gm.NoAccess
67 }
68 switch cfg.AnonAccess {
69 case "no-access":
70 return gm.NoAccess
71 case "read-only":
72 return gm.ReadOnlyAccess
73 case "read-write":
74 return gm.ReadWriteAccess
75 default:
76 return gm.NoAccess
77 }
78}