Skip to content

Commit 9ac1797

Browse files
ignore plugins in bootstrapping (#208)
1 parent 0b20767 commit 9ac1797

File tree

5 files changed

+48
-28
lines changed

5 files changed

+48
-28
lines changed

src/main/java/gov/nist/csd/pm/core/pap/PAP.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,12 +220,19 @@ private boolean isPolicyEmpty() throws PMException {
220220
boolean obligationsEmpty = query().obligations().getObligations().isEmpty();
221221
boolean resOpsEmpty = query().operations().getResourceOperations().isEmpty();
222222

223-
boolean adminOpsEmpty = query().operations().getAdminOperationNames().isEmpty();
224-
boolean routinesEmpty = query().routines().getAdminRoutineNames().isEmpty();
225-
226223
// ignore admin nodes
227224
nodes.removeIf(n -> AdminPolicyNode.isAdminPolicyNode(n.getId()));
228225

226+
// ignore plugin registry ops and routines
227+
Collection<String> adminOperationNames = query().operations().getAdminOperationNames();
228+
Collection<String> adminRoutineNames = query().routines().getAdminRoutineNames();
229+
230+
adminOperationNames.removeAll(pluginRegistry.getOperationNames());
231+
adminRoutineNames.removeAll(pluginRegistry.getRoutineNames());
232+
233+
boolean adminOpsEmpty = adminOperationNames.isEmpty();
234+
boolean routinesEmpty = adminRoutineNames.isEmpty();
235+
229236
return nodes.isEmpty()
230237
&& prohibitionsEmpty
231238
&& obligationsEmpty

src/main/java/gov/nist/csd/pm/core/pdp/bootstrap/PMLBootstrapper.java

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import gov.nist.csd.pm.core.common.exception.PMException;
44
import gov.nist.csd.pm.core.pap.PAP;
5+
import gov.nist.csd.pm.core.pap.function.PluginRegistry;
56
import gov.nist.csd.pm.core.pap.function.op.Operation;
67
import gov.nist.csd.pm.core.pap.function.routine.Routine;
78

@@ -11,35 +12,16 @@
1112

1213
public class PMLBootstrapper extends PolicyBootstrapper {
1314

14-
private List<Operation<?, ?>> operations;
15-
private List<Routine<?, ?>> routines;
1615
private final String bootstrapUser;
1716
private final String pml;
1817

19-
public PMLBootstrapper(List<Operation<?, ?>> operations, List<Routine<?, ?>> routines, String bootstrapUser, String pml) {
20-
this.operations = operations;
21-
this.routines = routines;
22-
this.bootstrapUser = bootstrapUser;
23-
this.pml = pml;
24-
}
25-
2618
public PMLBootstrapper(String bootstrapUser, String pml) {
27-
this.operations = new ArrayList<>();
28-
this.routines = new ArrayList<>();
2919
this.bootstrapUser = bootstrapUser;
3020
this.pml = pml;
3121
}
3222

3323
@Override
3424
public void bootstrap(PAP pap) throws PMException {
35-
for (Operation<?, ?> op : operations) {
36-
pap.plugins().registerOperation(op);
37-
}
38-
39-
for (Routine<?, ?> r : routines) {
40-
pap.plugins().registerRoutine(r);
41-
}
42-
4325
pap.runTx(tx -> {
4426
// create bootstrap policy and user
4527
long pc = tx.modify().graph().createPolicyClass("bootstrap");

src/test/java/gov/nist/csd/pm/core/pap/PAPTest.java

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66
import gov.nist.csd.pm.core.common.graph.node.NodeType;
77
import gov.nist.csd.pm.core.common.graph.relationship.AccessRightSet;
88
import gov.nist.csd.pm.core.common.graph.relationship.Association;
9+
import gov.nist.csd.pm.core.pap.function.PluginRegistry;
910
import gov.nist.csd.pm.core.pap.function.arg.FormalParameter;
1011
import gov.nist.csd.pm.core.pap.function.arg.Args;
1112
import gov.nist.csd.pm.core.pap.function.op.Operation;
1213
import gov.nist.csd.pm.core.impl.memory.pap.MemoryPAP;
1314
import gov.nist.csd.pm.core.pap.admin.AdminPolicyNode;
1415
import gov.nist.csd.pm.core.pap.function.routine.Routine;
1516
import gov.nist.csd.pm.core.pap.query.model.context.UserContext;
17+
import gov.nist.csd.pm.core.pdp.bootstrap.PMLBootstrapper;
1618
import gov.nist.csd.pm.core.pdp.bootstrap.PolicyBootstrapper;
1719
import gov.nist.csd.pm.core.util.SamplePolicy;
1820
import gov.nist.csd.pm.core.util.TestPAP;
@@ -81,7 +83,7 @@ void testTx() throws PMException {
8183
assertTrue(pap.query().graph().nodeExists("pc1"));
8284
assertTrue(pap.query().graph().nodeExists("oa1"));
8385
assertTrue(pap.query().graph().nodeExists("ua1"));
84-
assertEquals(pap.query().graph().getAssociationsWithSource(id("ua1")).iterator().next(), new Association(id("ua1"), id("oa1"), new AccessRightSet()));
86+
assertEquals(pap.query().graph().getAssociationsWithSource(id("ua1")).iterator().next(), new Association(id("ua1"), id("oa1"), new AccessRightSet()));
8587

8688
pap.beginTx();
8789
pap.modify().graph().deleteNode(id("ua1"));
@@ -120,12 +122,12 @@ public static void testAdminPolicy(PAP pap) throws PMException {
120122
assertTrue(pap.query().graph().nodeExists(AdminPolicyNode.PM_ADMIN_PC.nodeId()));
121123
Collection<Long> ascendants = pap.query().graph().getAdjacentAscendants(AdminPolicyNode.PM_ADMIN_PC.nodeId());
122124
assertEquals(1, ascendants.size());
123-
assertEquals(ascendants.iterator().next(), (AdminPolicyNode.PM_ADMIN_BASE_OA.nodeId()));
125+
assertEquals(ascendants.iterator().next(), (AdminPolicyNode.PM_ADMIN_BASE_OA.nodeId()));
124126

125127
assertTrue(pap.query().graph().nodeExists(AdminPolicyNode.PM_ADMIN_BASE_OA.nodeId()));
126128
Collection<Long> descendants = pap.query().graph().getAdjacentDescendants(AdminPolicyNode.PM_ADMIN_BASE_OA.nodeId());
127129
assertEquals(1, descendants.size());
128-
assertEquals(descendants.iterator().next(), (AdminPolicyNode.PM_ADMIN_PC.nodeId()));
130+
assertEquals(descendants.iterator().next(), (AdminPolicyNode.PM_ADMIN_PC.nodeId()));
129131
}
130132

131133
@Test
@@ -209,4 +211,30 @@ protected Args prepareArgs(Map<FormalParameter<?>, Object> argsMap) {
209211
assertTrue(pap.plugins().getOperationNames().contains("op1"));
210212
assertTrue(pap.plugins().getRoutineNames().contains("routine1"));
211213
}
214+
215+
@Test
216+
void testBootstrapDoesNotThrowExceptionWhenPluginRegistryHasPlugins() throws PMException {
217+
pap.plugins().registerOperation(new Operation<>("op1", List.of()) {
218+
@Override
219+
public Object execute(PAP pap, Args args) throws PMException {
220+
return null;
221+
}
222+
223+
@Override
224+
protected Args prepareArgs(Map<FormalParameter<?>, Object> argsMap) {
225+
return null;
226+
}
227+
228+
@Override
229+
public void canExecute(PAP pap, UserContext userCtx, Args args) throws PMException {
230+
231+
}
232+
});
233+
234+
assertDoesNotThrow(() -> pap.bootstrap(new PMLBootstrapper("u1", """
235+
create pc "pc1"
236+
create ua "ua1" in ["pc1"]
237+
assign "u1" to ["ua1"]
238+
""")));
239+
}
212240
}

src/test/java/gov/nist/csd/pm/core/pap/pml/pattern/subject/SubjectPatternTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ void testInPatternWhenUserDoesNotMatch() throws PMException {
167167
}
168168
""";
169169
MemoryPAP memoryPAP = new MemoryPAP();
170-
memoryPAP.bootstrap(new PMLBootstrapper(List.of(), List.of(), "u2", pml));
170+
memoryPAP.bootstrap(new PMLBootstrapper("u2", pml));
171171

172172
PDP pdp = new PDP(memoryPAP);
173173
EPP epp = new EPP(pdp, memoryPAP);

src/test/java/gov/nist/csd/pm/core/pdp/PMLBootstrapperTest.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,10 @@ protected Args prepareArgs(Map<FormalParameter<?>, Object> argsMap) {
7474
}
7575
};
7676

77-
pdp.bootstrap(new PMLBootstrapper(List.of(op1), List.of(routine1), "u1", input));
77+
pap.plugins().registerOperation(op1);
78+
pap.plugins().registerRoutine(routine1);
79+
80+
pdp.bootstrap(new PMLBootstrapper("u1", input));
7881

7982
assertTrue(pap.query().graph().nodeExists("pc1"));
8083
assertTrue(pap.query().graph().nodeExists("op1"));
@@ -90,7 +93,7 @@ void testBootstrapThrowsExceptionWhenUserNotAssigned() throws PMException {
9093
PDP pdp = new PDP(pap);
9194

9295
assertThrows(DisconnectedNodeException.class, () -> pdp.bootstrap(new PMLBootstrapper(
93-
List.of(), List.of(), "u1", "create pc \"pc1\""
96+
"u1", "create pc \"pc1\""
9497
)));
9598
}
9699

0 commit comments

Comments
 (0)