Skip to content

Commit 017349d

Browse files
authored
Merge pull request #13 from ConductorOne/add_dynamic_roles
[BB-398] Add dynamic roles
2 parents bc5785f + 4b8054e commit 017349d

File tree

3 files changed

+74
-17
lines changed

3 files changed

+74
-17
lines changed

pkg/connector/role.go

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package connector
33
import (
44
"context"
55
"fmt"
6+
"slices"
67

78
"github.com/conductorone/baton-jamf/pkg/jamf"
89
v2 "github.com/conductorone/baton-sdk/pb/c1/connector/v2"
@@ -22,11 +23,10 @@ func (o *roleResourceType) ResourceType(_ context.Context) *v2.ResourceType {
2223
return o.resourceType
2324
}
2425

25-
var privileges = []string{
26+
var privilegeSets = []string{
2627
"Administrator",
2728
"Auditor",
2829
"Enrollment Only",
29-
"Custom",
3030
}
3131

3232
// Create a new connector resource for a Jamf role.
@@ -56,7 +56,20 @@ func roleResource(ctx context.Context, role string, parentResourceID *v2.Resourc
5656

5757
func (o *roleResourceType) List(ctx context.Context, parentId *v2.ResourceId, token *pagination.Token) ([]*v2.Resource, string, annotations.Annotations, error) {
5858
var rv []*v2.Resource
59-
for _, privilege := range privileges {
59+
for _, privilegeSet := range privilegeSets {
60+
rr, err := roleResource(ctx, privilegeSet, parentId)
61+
if err != nil {
62+
return nil, "", nil, err
63+
}
64+
rv = append(rv, rr)
65+
}
66+
67+
res, err := o.client.GetPrivileges(ctx)
68+
if err != nil {
69+
return nil, "", nil, err
70+
}
71+
72+
for _, privilege := range res.Privileges {
6073
rr, err := roleResource(ctx, privilege, parentId)
6174
if err != nil {
6275
return nil, "", nil, err
@@ -84,7 +97,7 @@ func (o *roleResourceType) Entitlements(_ context.Context, resource *v2.Resource
8497

8598
func (o *roleResourceType) Grants(ctx context.Context, resource *v2.Resource, token *pagination.Token) ([]*v2.Grant, string, annotations.Annotations, error) {
8699
var rv []*v2.Grant
87-
100+
isCustomPrivilege := !slices.Contains(privilegeSets, resource.Id.Resource)
88101
userAccounts, groups, err := o.client.GetAccounts(ctx)
89102
if err != nil {
90103
return nil, "", nil, err
@@ -97,7 +110,12 @@ func (o *roleResourceType) Grants(ctx context.Context, resource *v2.Resource, to
97110
return nil, "", nil, err
98111
}
99112

100-
if resource.Id.Resource == group.PrivilegeSet {
113+
if isCustomPrivilege && slices.Contains(group.Privileges.JSSObjects, resource.Id.Resource) {
114+
privilegeGrant := grant.NewGrant(resource, memberEntitlement, gr.Id)
115+
rv = append(rv, privilegeGrant)
116+
continue
117+
}
118+
if group.PrivilegeSet == resource.Id.Resource {
101119
privilegeGrant := grant.NewGrant(resource, memberEntitlement, gr.Id)
102120
rv = append(rv, privilegeGrant)
103121
}
@@ -110,12 +128,16 @@ func (o *roleResourceType) Grants(ctx context.Context, resource *v2.Resource, to
110128
return nil, "", nil, err
111129
}
112130

113-
if resource.Id.Resource == userAccount.PrivilegeSet {
131+
if isCustomPrivilege && slices.Contains(userAccount.Privileges.JSSObjects, resource.Id.Resource) {
132+
privilegeGrant := grant.NewGrant(resource, memberEntitlement, gr.Id)
133+
rv = append(rv, privilegeGrant)
134+
continue
135+
}
136+
if userAccount.PrivilegeSet == resource.Id.Resource {
114137
privilegeGrant := grant.NewGrant(resource, memberEntitlement, gr.Id)
115138
rv = append(rv, privilegeGrant)
116139
}
117140
}
118-
119141
return rv, "", nil, nil
120142
}
121143

pkg/jamf/client.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const (
2828
userUrlPath = "/JSSResource/users/id/%d"
2929
usersUrlPath = "/JSSResource/users"
3030
keepAliveUrlPath = "/api/v1/auth/keep-alive"
31+
privilegesUrlPath = "/api/v1/api-role-privileges"
3132
)
3233

3334
type Client struct {
@@ -430,3 +431,17 @@ func logBody(body []byte, size int) string {
430431
}
431432
return string(body)
432433
}
434+
435+
func (c *Client) GetPrivileges(ctx context.Context) (*PrivilegesResponse, error) {
436+
url, err := c.getUrl(privilegesUrlPath)
437+
if err != nil {
438+
return nil, err
439+
}
440+
441+
var target PrivilegesResponse
442+
if err := c.doRequest(ctx, url, &target); err != nil {
443+
return nil, err
444+
}
445+
446+
return &target, nil
447+
}

pkg/jamf/models.go

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,36 @@ type BaseAccount struct {
2525
// UserAccount - user that has access to their system and can be granted permissions.
2626
type UserAccount struct {
2727
BaseType
28-
FullName string `json:"full_name"`
29-
Email string `json:"email"`
30-
EmailAddress string `json:"email_address"`
31-
Enabled string `json:"enabled"`
32-
AccessLevel string `json:"access_level"`
33-
PrivilegeSet string `json:"privilege_set"`
34-
Site BaseType `json:"site"`
28+
FullName string `json:"full_name"`
29+
Email string `json:"email"`
30+
EmailAddress string `json:"email_address"`
31+
Enabled string `json:"enabled"`
32+
AccessLevel string `json:"access_level"`
33+
PrivilegeSet string `json:"privilege_set"`
34+
Privileges Privileges `json:"privileges"`
35+
Site BaseType `json:"site"`
36+
}
37+
38+
type Privileges struct {
39+
// array of privileges the resource has access to
40+
JSSObjects []string `json:"jss_objects"`
3541
}
3642

3743
type Group struct {
3844
BaseType
39-
AccessLevel string `json:"access_level"`
40-
PrivilegeSet string `json:"privilege_set"`
41-
Site BaseType `json:"site"`
45+
AccessLevel string `json:"access_level"`
46+
// PrivilegeSet can take the following values:
47+
//
48+
// - "Administrator"
49+
//
50+
// - "Auditor"
51+
//
52+
// - "Enrollment Only"
53+
//
54+
// - "Custom"
55+
PrivilegeSet string `json:"privilege_set"`
56+
Privileges Privileges `json:"privileges"`
57+
Site BaseType `json:"site"`
4258
Members []struct {
4359
User BaseType `json:"user"`
4460
} `json:"members"`
@@ -111,3 +127,7 @@ type AccountsResponse struct {
111127
type SitesResponse struct {
112128
Sites []Site `json:"sites"`
113129
}
130+
131+
type PrivilegesResponse struct {
132+
Privileges []string `json:"privileges"`
133+
}

0 commit comments

Comments
 (0)