1package proto
2
3import (
4 "fmt"
5 "strings"
6
7 "github.com/gliderlabs/ssh"
8)
9
10// AccessLevel is the level of access allowed to a repo.
11type AccessLevel int
12
13const (
14 // NoAccess does not allow access to the repo.
15 NoAccess AccessLevel = iota
16
17 // ReadOnlyAccess allows read-only access to the repo.
18 ReadOnlyAccess
19
20 // ReadWriteAccess allows read and write access to the repo.
21 ReadWriteAccess
22
23 // AdminAccess allows read, write, and admin access to the repo.
24 AdminAccess
25)
26
27// String implements the Stringer interface for AccessLevel.
28func (a AccessLevel) String() string {
29 switch a {
30 case NoAccess:
31 return "no-access"
32 case ReadOnlyAccess:
33 return "read-only"
34 case ReadWriteAccess:
35 return "read-write"
36 case AdminAccess:
37 return "admin-access"
38 default:
39 return ""
40 }
41}
42
43// UnmarshalText implements the encoding.TextUnmarshaler interface.
44func (a *AccessLevel) UnmarshalText(text []byte) error {
45 switch strings.ToLower(string(text)) {
46 case "no-access":
47 *a = NoAccess
48 case "read-only":
49 *a = ReadOnlyAccess
50 case "read-write":
51 *a = ReadWriteAccess
52 case "admin-access":
53 *a = AdminAccess
54 default:
55 return fmt.Errorf("invalid access level: %s", text)
56 }
57 return nil
58}
59
60// Access is an interface that defines the access level for repositories.
61type Access interface {
62 AuthRepo(repo string, pk ssh.PublicKey) AccessLevel
63 IsCollab(repo string, pk ssh.PublicKey) bool
64 IsAdmin(pk ssh.PublicKey) bool
65}