-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathppl.go
72 lines (64 loc) · 1.38 KB
/
ppl.go
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
66
67
68
69
70
71
72
package main
import (
"time"
)
type JITUser struct {
Email string
Expires time.Time
}
func toPPL(jitUsers []JITUser) Policy_Ppl {
rules := make([]PPLRule, 0)
for _, jitUser := range jitUsers {
criteria := []PPLCriteria{
{"email": jitUser.Email},
}
if jitUser.Expires.IsZero() {
criteria = append(criteria, map[string]any{
"reject": true,
})
} else {
criteria = append(criteria, map[string]any{
"date": map[string]any{
"before": jitUser.Expires.Format(time.RFC3339),
},
})
}
rules = append(rules, PPLRule{
Allow: &PPLRuleBody{
And: &criteria,
},
})
}
var ppl Policy_Ppl
_ = ppl.FromPolicyPpl1(rules)
return ppl
}
func fromPPL(ppl Policy_Ppl) []JITUser {
var rules []PPLRule
if r, err := ppl.AsPPLRule(); err == nil {
rules = append(rules, r)
} else if rs, err := ppl.AsPolicyPpl1(); err == nil {
rules = append(rules, rs...)
}
var jitUsers []JITUser
for _, r := range rules {
if r.Allow == nil || r.Allow.And == nil {
continue
}
var jitUser JITUser
for _, c := range *r.Allow.And {
if email, ok := c["email"].(string); ok {
jitUser.Email = email
}
if m, ok := c["date"].(map[string]any); ok {
if tm, err := time.Parse(time.RFC3339, m["before"].(string)); err == nil {
jitUser.Expires = tm
}
}
}
if jitUser.Email != "" {
jitUsers = append(jitUsers, jitUser)
}
}
return jitUsers
}