Skip to content

Commit

Permalink
Support 'user' in nested element
Browse files Browse the repository at this point in the history
  • Loading branch information
hknutzen committed Apr 11, 2024
1 parent 3164ccc commit 7609d63
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 13 deletions.
41 changes: 36 additions & 5 deletions go/pkg/pass1/cut-netspoc.go
Original file line number Diff line number Diff line change
Expand Up @@ -439,24 +439,55 @@ func (c *spoc) markAndSubstElements(
}

func (c *spoc) markElements(
toplevel []ast.Toplevel, m map[string]*ast.TopList, isUsed map[string]bool) {

toplevel []ast.Toplevel, m map[string]*ast.TopList, isUsed map[string]bool,
) {
for _, top := range toplevel {
if x, ok := top.(*ast.Service); ok {
typedName := x.Name
if !isUsed[typedName] {
continue
}
v6 := x.IPV6
c.markAndSubstElements(&x.User.Elements, "user of "+typedName, v6, m, isUsed)
c.markAndSubstElements(
&x.User.Elements, "user of "+typedName, v6, m, isUsed)
for _, r := range x.Rules {
c.markAndSubstElements(&r.Src.Elements, "src of "+typedName, v6, m, isUsed)
c.markAndSubstElements(&r.Dst.Elements, "dst of "+typedName, v6, m, isUsed)
if !hasUserInList(r.Src.Elements) {
c.markAndSubstElements(
&r.Src.Elements, "src of "+typedName, v6, m, isUsed)
}
if !hasUserInList(r.Dst.Elements) {
c.markAndSubstElements(
&r.Dst.Elements, "dst of "+typedName, v6, m, isUsed)
}
}
}
}
}

func hasUserInList(l []ast.Element) bool {
for _, el := range l {
if hasUser(el) {
return true
}
}
return false
}

func hasUser(el ast.Element) bool {
switch x := el.(type) {
case *ast.User:
return true
case ast.AutoElem:
return hasUserInList(x.GetElements())
case *ast.Intersection:
return hasUserInList(x.Elements)
case *ast.Complement:
return hasUser(x.Element)
default:
return false
}
}

func (c *spoc) collectGroups(toplevel []ast.Toplevel) map[string]*ast.TopList {
m := make(map[string]*ast.TopList)
for _, top := range toplevel {
Expand Down
43 changes: 35 additions & 8 deletions go/testdata/cut-netspoc/cut-netspoc.t
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,31 @@ service:test = {
}
=END=
############################################################
=TITLE=User in src and dst
=INPUT=
[[topo]]
service:test = {
user = interface:asa1.[all];
permit src = network:[user]; dst = user; prt = icmp 8;
}
=OUTPUT=
network:n1 = { ip = 10.1.1.0/24; }
network:n2 = { ip = 10.1.2.0/24; }
router:asa1 = {
managed;
model = ASA;
interface:n1 = { ip = 10.1.1.1; hardware = n1; }
interface:n2 = { ip = 10.1.2.1; hardware = n2; }
}
service:test = {
user = interface:asa1.[all];
permit src = network:[user];
dst = user;
prt = icmp 8;
}
=END=
############################################################
=TITLE=Auto interface at unmanaged router
=INPUT=
Expand Down Expand Up @@ -3165,7 +3190,7 @@ service:s1 = {
=END=
############################################################
=TITLE=Intersection with user
=INPUT=
=TEMPL=input
network:n1 = { ip = 10.1.1.0/24; }
network:n2 = { ip = 10.1.2.0/24; }
network:n3 = { ip = 10.1.3.0/24; }
Expand All @@ -3177,17 +3202,19 @@ router:r1 = {
interface:n3 = { ip = 10.1.3.1; hardware = n3; }
}
service:s1 = {
user = network:n1, network:n2
user = network:n1,
network:n2,
;
permit src = user &! network:n2;
permit src = user
&! network:n2
;
dst = network:n3;
prt = tcp 80;
}
=END=
# Valid for netspoc, but not supported by cut-netspoc.
=ERROR=
Error: Unexpected reference to 'user' in intersection of src of service:s1
Warning: Useless delete of network:n2 in src of service:s1
=INPUT=
[[input]]
=OUTPUT=
[[input]]
=END=
############################################################
Expand Down

0 comments on commit 7609d63

Please sign in to comment.