/
permission_builder.go
85 lines (73 loc) · 2.61 KB
/
permission_builder.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
73
74
75
76
77
78
79
80
81
82
83
84
85
package model
import "github.com/OpenBankingUK/conformance-suite/pkg/permissions"
// NewPermissionGroup returns a list of Code objects associated with a testcase
func NewPermissionGroup(tc TestCase) permissions.Group {
b := newPermissionBuilder()
return newPermissionGroupWithOptions(tc, b)
}
// newPermissionGroupWithOptions returns a list of Code objects associated with a testcase
// allows you to pass a diff static data access
func newPermissionGroupWithOptions(tc TestCase, builder permissionBuilder) permissions.Group {
return permissions.NewGroup(
tc.ID,
builder.includedPermission(tc.Context, tc.Input.Endpoint),
builder.excludedPermissions(tc.Context),
)
}
func NewDefaultPermissionGroup(tc TestCase) permissions.Group {
builder := newPermissionBuilder()
return permissions.NewGroup(
tc.ID,
builder.includedPermission(Context{}, tc.Input.Endpoint),
builder.excludedPermissions(Context{}),
)
}
const (
permissionIncludedKey = "permissions"
permissionExcludedKey = "permissions_excluded"
)
// permissionBuilder helper to calculate permission from a testcase
// need api static data to fetch default set of permissions
type permissionBuilder struct {
standardPermissions standardPermissions
}
func newPermissionBuilder() permissionBuilder {
return newPermissionBuilderWithOptions(newStandardPermissions())
}
func newPermissionBuilderWithOptions(standardPermissions standardPermissions) permissionBuilder {
return permissionBuilder{
standardPermissions: standardPermissions,
}
}
// includedPermission returns the list of permission names that need to be included
// in the access token for this testcase. See permission model docs for more information
func (b permissionBuilder) includedPermission(ctx Context, endpoint string) permissions.CodeSet {
values, err := ctx.GetStringSlice(permissionIncludedKey)
if err == nil {
return mapStringToCodeSet(values)
}
defaultPerms, err := b.standardPermissions.defaultForEndpoint(endpoint)
if err != nil {
return permissions.NoCodeSet()
}
codes := []string{}
for _, code := range defaultPerms {
codes = append(codes, string(code))
}
return mapStringToCodeSet(codes)
}
// excludedPermissions return a list of excluded permissions from context
func (b permissionBuilder) excludedPermissions(ctx Context) permissions.CodeSet {
values, err := ctx.GetStringSlice(permissionExcludedKey)
if err != nil {
return permissions.NoCodeSet()
}
return mapStringToCodeSet(values)
}
func mapStringToCodeSet(values []string) permissions.CodeSet {
var result permissions.CodeSet
for _, value := range values {
result = append(result, permissions.Code(value))
}
return result
}