access.go

 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}