-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathacl.go
More file actions
65 lines (55 loc) · 1.2 KB
/
acl.go
File metadata and controls
65 lines (55 loc) · 1.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package klev
import (
"strings"
)
type ACLItem struct {
Subject
Action
Object string
}
func (l ACLItem) MarshalText() ([]byte, error) {
var parts = []string{l.Subject.string}
if l.Action.string != "" {
parts = append(parts, l.Action.string)
if l.Object != "" {
parts = append(parts, l.Object)
}
}
return []byte(strings.Join(parts, ":")), nil
}
func (l *ACLItem) UnmarshalText(text []byte) error {
item := string(text)
subjectStr, item, found := strings.Cut(item, ":")
subject, err := ParseSubject(subjectStr)
if err != nil {
return err
}
l.Subject = subject
if !found {
return nil
}
actionStr, item, found := strings.Cut(item, ":")
action, err := ParseAction(actionStr)
if err != nil {
return err
}
l.Action = action
if !found {
return nil
}
// TODO validate object
if item == "" {
return ErrACLObjectMissing()
}
l.Object = item
return nil
}
func ACLSubject(subject Subject) ACLItem {
return ACLItem{Subject: subject}
}
func ACLAction(subject Subject, action Action) ACLItem {
return ACLItem{Subject: subject, Action: action}
}
func ACLObject(subject Subject, action Action, id interface{ IDValue() string }) ACLItem {
return ACLItem{subject, action, id.IDValue()}
}