@@ -29,30 +29,42 @@ import (
29
29
"github.com/gravitational/teleport/lib/msgraph"
30
30
)
31
31
32
+ type dirObjMetadata struct {
33
+ objectType string
34
+ }
35
+
36
+ type queryResult struct {
37
+ metadata dirObjMetadata
38
+ dirObj msgraph.DirectoryObject
39
+ }
40
+
32
41
// fetchPrincipals fetches the Azure principals (users, groups, and service principals) using the Graph API
33
42
func fetchPrincipals (ctx context.Context , subscriptionID string , cli * msgraph.Client ) ([]* accessgraphv1alpha.AzurePrincipal , error ) { //nolint: unused // invoked in a dependent PR
34
43
var params = & url.Values {
35
44
"$expand" : []string {"memberOf" },
36
45
}
37
46
38
47
// Fetch the users, groups, and service principals as directory objects
39
- var dirObjs []msgraph. DirectoryObject
48
+ var queryResults []queryResult
40
49
err := cli .IterateUsers (ctx , params , func (user * msgraph.User ) bool {
41
- dirObjs = append (dirObjs , user .DirectoryObject )
50
+ res := queryResult {metadata : dirObjMetadata {objectType : "user" }, dirObj : user .DirectoryObject }
51
+ queryResults = append (queryResults , res )
42
52
return true
43
53
})
44
54
if err != nil {
45
55
return nil , trace .Wrap (err )
46
56
}
47
57
err = cli .IterateGroups (ctx , params , func (group * msgraph.Group ) bool {
48
- dirObjs = append (dirObjs , group .DirectoryObject )
58
+ res := queryResult {metadata : dirObjMetadata {objectType : "group" }, dirObj : group .DirectoryObject }
59
+ queryResults = append (queryResults , res )
49
60
return true
50
61
})
51
62
if err != nil {
52
63
return nil , trace .Wrap (err )
53
64
}
54
65
err = cli .IterateServicePrincipals (ctx , params , func (servicePrincipal * msgraph.ServicePrincipal ) bool {
55
- dirObjs = append (dirObjs , servicePrincipal .DirectoryObject )
66
+ res := queryResult {metadata : dirObjMetadata {objectType : "servicePrincipal" }, dirObj : servicePrincipal .DirectoryObject }
67
+ queryResults = append (queryResults , res )
56
68
return true
57
69
})
58
70
if err != nil {
@@ -62,22 +74,23 @@ func fetchPrincipals(ctx context.Context, subscriptionID string, cli *msgraph.Cl
62
74
// Return the users, groups, and service principals as protobuf messages
63
75
var fetchErrs []error
64
76
var pbPrincipals []* accessgraphv1alpha.AzurePrincipal
65
- for _ , dirObj := range dirObjs {
66
- if dirObj .ID == nil || dirObj .DisplayName == nil {
67
- fetchErrs = append (fetchErrs , trace .BadParameter ("nil values on msgraph directory object: %v" , dirObj ))
77
+ for _ , res := range queryResults {
78
+ if res .dirObj .ID == nil || res .dirObj .DisplayName == nil {
79
+ fetchErrs = append (fetchErrs ,
80
+ trace .BadParameter ("nil values on msgraph directory object: %v" , res .dirObj ))
68
81
continue
69
82
}
70
83
var memberOf []string
71
- for _ , member := range dirObj .MemberOf {
84
+ for _ , member := range res . dirObj .MemberOf {
72
85
memberOf = append (memberOf , member .ID )
73
86
}
74
87
pbPrincipals = append (pbPrincipals , & accessgraphv1alpha.AzurePrincipal {
75
- Id : * dirObj .ID ,
88
+ Id : * res . dirObj .ID ,
76
89
SubscriptionId : subscriptionID ,
77
90
LastSyncTime : timestamppb .Now (),
78
- DisplayName : * dirObj .DisplayName ,
91
+ DisplayName : * res . dirObj .DisplayName ,
79
92
MemberOf : memberOf ,
80
- ObjectType : "user" ,
93
+ ObjectType : res . metadata . objectType ,
81
94
})
82
95
}
83
96
return pbPrincipals , trace .NewAggregate (fetchErrs ... )
0 commit comments