@@ -31,7 +31,8 @@ extension MemoryAdapter: Adapter {
3131 for line in policy {
3232 let sec = line [ 0 ]
3333 let ptype = line [ 1 ]
34- let rule = Array ( line [ 1 ... ] )
34+ // Model policies should NOT include ptype; drop sec and ptype headers
35+ let rule = Array ( line. dropFirst ( 2 ) )
3536 if let ast = m. getModel ( ) [ sec] ? [ ptype] {
3637 ast. policy. append ( rule)
3738 }
@@ -44,7 +45,7 @@ extension MemoryAdapter: Adapter {
4445 for line in policy {
4546 let sec = line [ 0 ]
4647 let ptype = line [ 1 ]
47- let rule = Array ( line [ 1 ... ] )
48+ let rule = Array ( line. dropFirst ( 2 ) )
4849 if let ast = m. getModel ( ) [ sec] ? [ ptype] {
4950 ast. policy. append ( rule)
5051 }
@@ -55,18 +56,18 @@ extension MemoryAdapter: Adapter {
5556 for line in policy {
5657 let sec = line [ 0 ]
5758 let ptype = line [ 1 ]
58- let rule = Array ( line [ 1 ... ] )
59+ let rule = Array ( line. dropFirst ( 2 ) )
5960 var isFiltered = false
6061 if sec == " p " {
6162 for (i, r) in f. p. enumerated ( ) {
62- if !r. isEmpty && r != rule [ i+ 1 ] {
63+ if !r. isEmpty && r != rule [ i] {
6364 isFiltered = true
6465 }
6566 }
6667 }
6768 if sec == " g " {
6869 for (i, r) in f. g. enumerated ( ) {
69- if !r. isEmpty && r != rule [ i+ 1 ] {
70+ if !r. isEmpty && r != rule [ i] {
7071 isFiltered = true
7172 }
7273 }
@@ -87,18 +88,18 @@ extension MemoryAdapter: Adapter {
8788 for line in policy {
8889 let sec = line [ 0 ]
8990 let ptype = line [ 1 ]
90- let rule = Array ( line [ 1 ... ] )
91+ let rule = Array ( line. dropFirst ( 2 ) )
9192 var isFiltered = false
9293 if sec == " p " {
9394 for (i, r) in f. p. enumerated ( ) {
94- if !r. isEmpty && r != rule [ i+ 1 ] {
95+ if !r. isEmpty && r != rule [ i] {
9596 isFiltered = true
9697 }
9798 }
9899 }
99100 if sec == " g " {
100101 for (i, r) in f. g. enumerated ( ) {
101- if !r. isEmpty && r != rule [ i+ 1 ] {
102+ if !r. isEmpty && r != rule [ i] {
102103 isFiltered = true
103104 }
104105 }
@@ -117,25 +118,21 @@ extension MemoryAdapter: Adapter {
117118 self . policy = [ ]
118119 if let astMap = m. getModel ( ) [ " p " ] {
119120 for (ptype, ast) in astMap {
120- ptype. forEach { sec in
121- for policy in ast. policy {
122- var rule = policy
123- rule. insert ( ptype, at: 0 )
124- rule. insert ( String ( sec) , at: 0 )
125- self . policy. insert ( rule)
126- }
121+ for policy in ast. policy {
122+ var rule = policy
123+ rule. insert ( ptype, at: 0 )
124+ rule. insert ( " p " , at: 0 )
125+ self . policy. insert ( rule)
127126 }
128127 }
129128 }
130129 if let astMap = m. getModel ( ) [ " g " ] {
131130 for (ptype, ast) in astMap {
132- ptype. forEach { sec in
133- for policy in ast. policy {
134- var rule = policy
135- rule. insert ( ptype, at: 0 )
136- rule. insert ( String ( sec) , at: 0 )
137- self . policy. insert ( rule)
138- }
131+ for policy in ast. policy {
132+ var rule = policy
133+ rule. insert ( ptype, at: 0 )
134+ rule. insert ( " g " , at: 0 )
135+ self . policy. insert ( rule)
139136 }
140137 }
141138 }
@@ -147,25 +144,21 @@ extension MemoryAdapter: Adapter {
147144 self . policy = [ ]
148145 if let astMap = m. getModel ( ) [ " p " ] {
149146 for (ptype, ast) in astMap {
150- ptype. forEach { sec in
151- for policy in ast. policy {
152- var rule = policy
153- rule. insert ( ptype, at: 0 )
154- rule. insert ( String ( sec) , at: 0 )
155- self . policy. insert ( rule)
156- }
147+ for policy in ast. policy {
148+ var rule = policy
149+ rule. insert ( ptype, at: 0 )
150+ rule. insert ( " p " , at: 0 )
151+ self . policy. insert ( rule)
157152 }
158153 }
159154 }
160155 if let astMap = m. getModel ( ) [ " g " ] {
161156 for (ptype, ast) in astMap {
162- ptype. forEach { sec in
163- for policy in ast. policy {
164- var rule = policy
165- rule. insert ( ptype, at: 0 )
166- rule. insert ( String ( sec) , at: 0 )
167- self . policy. insert ( rule)
168- }
157+ for policy in ast. policy {
158+ var rule = policy
159+ rule. insert ( ptype, at: 0 )
160+ rule. insert ( " g " , at: 0 )
161+ self . policy. insert ( rule)
169162 }
170163 }
171164 }
@@ -258,14 +251,17 @@ extension MemoryAdapter: Adapter {
258251 rule. insert ( sec, at: 0 )
259252 return rule
260253 }
254+ // Atomic semantics: if any rule doesn't exist, do not remove any and return false.
261255 for rule in rules {
262- if policy. contains ( rule) {
256+ if ! policy. contains ( rule) {
263257 allRemoved = false
264- return eventloop . makeSucceededFuture ( allRemoved )
258+ break
265259 }
266260 }
267- for rule in rules {
268- self . policy. remove ( rule)
261+ if allRemoved {
262+ for rule in rules {
263+ _ = self . policy. remove ( rule)
264+ }
269265 }
270266 return eventloop. makeSucceededFuture ( allRemoved)
271267 }
@@ -279,14 +275,17 @@ extension MemoryAdapter: Adapter {
279275 rule. insert ( sec, at: 0 )
280276 return rule
281277 }
278+ // Atomic semantics
282279 for rule in rules {
283- if policy. contains ( rule) {
280+ if ! policy. contains ( rule) {
284281 allRemoved = false
285- return allRemoved
282+ break
286283 }
287284 }
288- for rule in rules {
289- self . policy. remove ( rule)
285+ if allRemoved {
286+ for rule in rules {
287+ _ = self . policy. remove ( rule)
288+ }
290289 }
291290 return allRemoved
292291 }
0 commit comments