Skip to content

Commit c97ce59

Browse files
feedback from github.com//pull/422 (#423)
* feedback from github.com//pull/422 * Update pkg/go/graph/graph_builder.go Co-authored-by: Adrian Tam <[email protected]> --------- Co-authored-by: Adrian Tam <[email protected]>
1 parent ed0cfba commit c97ce59

File tree

3 files changed

+34
-11
lines changed

3 files changed

+34
-11
lines changed

pkg/go/graph/graph.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,7 @@ func (g *AuthorizationModelGraph) Reversed() (*AuthorizationModelGraph, error) {
8383
if !ok {
8484
return nil, fmt.Errorf("%w: could not cast to AuthorizationModelEdge", ErrBuildingGraph)
8585
}
86-
newEdge := graphBuilder.AddEdge(nextLine.To(), nextLine.From(), casted.edgeType, casted.tuplesetRelation, "")
87-
newEdge.conditions = casted.conditions
86+
graphBuilder.AddEdge(nextLine.To(), nextLine.From(), casted.edgeType, casted.tuplesetRelation, casted.conditions)
8887
}
8988
}
9089

pkg/go/graph/graph_builder.go

+18-9
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ func checkRewrite(graphBuilder *AuthorizationModelGraphBuilder, parentNode *Auth
111111

112112
// add one edge "operator" -> "relation that defined the operator"
113113
// Note: if this is a composition of operators, operationNode will be nil and this edge won't be added.
114-
graphBuilder.AddEdge(operatorNodeParent, parentNode, RewriteEdge, "", "")
114+
graphBuilder.AddEdge(operatorNodeParent, parentNode, RewriteEdge, "", nil)
115115
for _, child := range children {
116116
checkRewrite(graphBuilder, operatorNodeParent, model, child, typeDef, relation)
117117
}
@@ -160,7 +160,7 @@ func parseComputed(graphBuilder *AuthorizationModelGraphBuilder, parentNode *Aut
160160
if parentNode.nodeType == SpecificTypeAndRelation && newNode.nodeType == SpecificTypeAndRelation {
161161
nodeType = ComputedEdge
162162
}
163-
graphBuilder.AddEdge(newNode, parentNode, nodeType, "", "")
163+
graphBuilder.AddEdge(newNode, parentNode, nodeType, "", nil)
164164
}
165165

166166
func parseTupleToUserset(graphBuilder *AuthorizationModelGraphBuilder, parentNode graph.Node, model *openfgav1.AuthorizationModel, typeDef *openfgav1.TypeDefinition, rewrite *openfgav1.TupleToUserset) {
@@ -188,8 +188,15 @@ func parseTupleToUserset(graphBuilder *AuthorizationModelGraphBuilder, parentNod
188188
typeTuplesetRelation := fmt.Sprintf("%s#%s", typeDef.GetType(), tuplesetRelation)
189189

190190
if graphBuilder.hasEdge(nodeSource, parentNode, TTUEdge, typeTuplesetRelation) {
191-
// de-dup types that are conditioned, e.g. if define viewer: [user, user with condX]
192-
// we only draw one edge from user to x#viewer
191+
// we don't need to do any condition update, only de-dup the edge. In case of TTU
192+
// the direct relation will have the conditions
193+
// for example, in the case of
194+
// type group
195+
// relations
196+
// define rel1: [user] or rel1 from parent
197+
// define parent: [group, group with condX]
198+
// In the graph we only have one TTU edge from the OR node to the group#rel1 node, but there are no conditions associated to it
199+
// the conditions are associated to the edge from group#parent node to the group node. This direct edge has two conditions: none and condX
193200
continue
194201
}
195202

@@ -231,14 +238,13 @@ func (g *AuthorizationModelGraphBuilder) getNodeByLabel(uniqueLabel string) *Aut
231238
return authModelNode
232239
}
233240

234-
func (g *AuthorizationModelGraphBuilder) AddEdge(from, to graph.Node, edgeType EdgeType, tuplesetRelation string, condition string) *AuthorizationModelEdge {
241+
func (g *AuthorizationModelGraphBuilder) AddEdge(from, to graph.Node, edgeType EdgeType, tuplesetRelation string, conditions []string) *AuthorizationModelEdge {
235242
if from == nil || to == nil {
236243
return nil
237244
}
238-
if condition == "" {
239-
condition = NoCond
245+
if len(conditions) == 0 {
246+
conditions = []string{NoCond}
240247
}
241-
conditions := []string{condition}
242248

243249
l := g.NewLine(from, to)
244250
newLine := &AuthorizationModelEdge{Line: l, edgeType: edgeType, tuplesetRelation: tuplesetRelation, conditions: conditions}
@@ -267,7 +273,10 @@ func (g *AuthorizationModelGraphBuilder) upsertEdge(from, to graph.Node, edgeTyp
267273
}
268274
}
269275

270-
g.AddEdge(from, to, edgeType, tuplesetRelation, condition)
276+
if condition == "" {
277+
condition = NoCond
278+
}
279+
g.AddEdge(from, to, edgeType, tuplesetRelation, []string{condition})
271280
}
272281

273282
func (g *AuthorizationModelGraphBuilder) hasEdge(from, to graph.Node, edgeType EdgeType, tuplesetRelation string) bool {

pkg/go/graph/weighted_graph_builder_test.go

+15
Original file line numberDiff line numberDiff line change
@@ -519,20 +519,27 @@ func TestValidConditionalGraphModel(t *testing.T) {
519519
conditions := edges[0].conditions
520520
require.Empty(t, edges[0].tuplesetRelation)
521521
require.Len(t, conditions, 2)
522+
require.Equal(t, "none", conditions[0])
523+
require.Equal(t, "condX", conditions[1])
524+
522525
edges, _ = graph.GetEdgesFromNode(graph.nodes["job#can_read"])
523526
require.Len(t, edges, 1)
524527
conditions = edges[0].conditions
525528
require.Len(t, conditions, 1)
529+
require.Equal(t, "none", conditions[0])
526530
require.Equal(t, "job#permission", edges[0].tuplesetRelation)
527531
edges, _ = graph.GetEdgesFromNode(graph.nodes["job#permission"])
528532
require.Len(t, edges, 1)
529533
conditions = edges[0].conditions
530534
require.Len(t, conditions, 2)
535+
require.Equal(t, "none", conditions[0])
536+
require.Equal(t, "condX", conditions[1])
531537
require.Equal(t, "", edges[0].tuplesetRelation)
532538
edges, _ = graph.GetEdgesFromNode(graph.nodes["role#assignee"])
533539
require.Len(t, edges, 1)
534540
conditions = edges[0].conditions
535541
require.Len(t, conditions, 1)
542+
require.Equal(t, "none", conditions[0])
536543
require.Equal(t, "", edges[0].tuplesetRelation)
537544
edges, _ = graph.GetEdgesFromNode(graph.nodes["permission#member"])
538545
require.Len(t, edges, 2)
@@ -547,19 +554,25 @@ func TestValidConditionalGraphModel(t *testing.T) {
547554
}
548555
conditions = recursiveEdge.conditions
549556
require.Len(t, conditions, 2)
557+
require.Equal(t, "none", conditions[0])
558+
require.Equal(t, "condX", conditions[1])
550559
require.Equal(t, "", recursiveEdge.tuplesetRelation)
551560
conditions = userEdge.conditions
552561
require.Len(t, conditions, 1)
562+
require.Equal(t, "none", conditions[0])
553563
require.Equal(t, "", userEdge.tuplesetRelation)
554564
edges, _ = graph.GetEdgesFromNode(graph.nodes["job#owner"])
555565
require.Len(t, edges, 1)
556566
conditions = edges[0].conditions
557567
require.Len(t, conditions, 2)
568+
require.Equal(t, "none", conditions[0])
569+
require.Equal(t, "condX", conditions[1])
558570
require.Equal(t, "", edges[0].tuplesetRelation)
559571
edges, _ = graph.GetEdgesFromNode(graph.nodes["job#can_view"])
560572
require.Len(t, edges, 1)
561573
conditions = edges[0].conditions
562574
require.Len(t, conditions, 1)
575+
require.Equal(t, "none", conditions[0])
563576
require.Equal(t, "", edges[0].tuplesetRelation)
564577
edges, _ = graph.GetEdgesFromNode(edges[0].to) // OR node
565578
require.Len(t, edges, 2)
@@ -572,10 +585,12 @@ func TestValidConditionalGraphModel(t *testing.T) {
572585
}
573586
conditions = recursiveEdge.conditions
574587
require.Len(t, conditions, 1)
588+
require.Equal(t, "none", conditions[0])
575589
require.Equal(t, "job#owner", recursiveEdge.tuplesetRelation)
576590
conditions = userEdge.conditions
577591
require.Len(t, conditions, 1)
578592
require.Equal(t, "", userEdge.tuplesetRelation)
593+
require.Equal(t, "none", conditions[0])
579594

580595
require.Equal(t, 2, graph.nodes["permission#assignee"].weights["user"])
581596
require.Equal(t, 3, graph.nodes["job#can_read"].weights["user"])

0 commit comments

Comments
 (0)