Skip to content

Commit

Permalink
feat: fix "ABAC" model enforceEx error (#40)
Browse files Browse the repository at this point in the history
  • Loading branch information
liewstar authored Jan 18, 2025
1 parent cb0fa09 commit 623968c
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 23 deletions.
11 changes: 11 additions & 0 deletions examples/abac_model.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[request_definition]
r = sub, obj

[policy_definition]
p = sub, obj

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = r.sub == r.obj.Owner
Empty file added examples/abac_policy.csv
Empty file.
53 changes: 30 additions & 23 deletions src/main/java/org/casbin/CommandExecutor.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,23 +33,29 @@ public CommandExecutor(NewEnforcer enforcer, String inputMethodName, String[] in
* @return A JSON formatted string representing the key-value pairs from the input string.
*/
public static String convertToJson(String input) {
input = input.trim().substring(1, input.length() - 1).trim();
StringBuilder jsonBuilder = new StringBuilder("{");
String[] pairs = input.split(",");
for (String pair : pairs) {
pair = pair.trim();
String[] keyValue = pair.split(":");
if (keyValue.length == 2) {
String key = keyValue[0].trim();
String value = keyValue[1].trim();
jsonBuilder.append("\"").append(key).append("\":").append(value).append(",");
input = input.trim();
// Handle the simple format {key: value}
if (!input.contains("\"")) {
input = input.substring(1, input.length() - 1).trim();
StringBuilder jsonBuilder = new StringBuilder("{");
String[] pairs = input.split(",");
for (String pair : pairs) {
pair = pair.trim();
String[] keyValue = pair.split(":");
if (keyValue.length == 2) {
String key = keyValue[0].trim();
String value = keyValue[1].trim();
jsonBuilder.append("\"").append(key).append("\":").append(value).append(",");
}
}
if (jsonBuilder.length() > 1) {
jsonBuilder.deleteCharAt(jsonBuilder.length() - 1);
}
jsonBuilder.append("}");
return jsonBuilder.toString();
}
if (jsonBuilder.length() > 1) {
jsonBuilder.deleteCharAt(jsonBuilder.length() - 1);
}
jsonBuilder.append("}");
return jsonBuilder.toString();

return input;
}

public String outputResult() throws InvocationTargetException, IllegalAccessException, JsonProcessingException {
Expand Down Expand Up @@ -104,16 +110,17 @@ public String outputResult() throws InvocationTargetException, IllegalAccessExce

Object[] extraConvertedParams = new Object[inputVal.length];
boolean hasJson = false;
try{
try {
ObjectMapper objectMapper = new ObjectMapper();
if(inputVal.length > 0 && inputVal[0].trim().startsWith("{")) {
Map<String, Object> objectMap = objectMapper.readValue(convertToJson(inputVal[0]), new TypeReference<Map<String, Object>>() {
});
extraConvertedParams[0] = objectMap;
if (inputVal.length >= 1) {
System.arraycopy(inputVal, 1, extraConvertedParams, 1, inputVal.length - 1);
for (int i = 0; i < inputVal.length; i++) {
if (inputVal[i].trim().startsWith("{")) {
Map<String, Object> objectMap = objectMapper.readValue(convertToJson(inputVal[i]), new TypeReference<Map<String, Object>>() {
});
extraConvertedParams[i] = objectMap;
hasJson = true;
} else {
extraConvertedParams[i] = inputVal[i];
}
hasJson = true;
}
} catch (Exception e) {
e.printStackTrace();
Expand Down
2 changes: 2 additions & 0 deletions src/test/java/org/casbin/ClientTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,8 @@ public void resetBasicWithResourcesPolicyFile() {
public void testABACRule() {
assertEquals(Client.run(new String[]{"enforce", "-m", "examples/abac_rule_model.conf", "-p", "examples/abac_rule_policy.csv", "{Age: 30}", "/data1", "read"}), "{\"allow\":true,\"explain\":null}");
assertEquals(Client.run(new String[]{"enforceEx", "-m", "examples/abac_rule_model.conf", "-p", "examples/abac_rule_policy.csv", "{Age: 30}", "/data1", "read"}), "{\"allow\":true,\"explain\":[\"r.sub.Age > 18 && r.sub.Age < 60\",\"/data1\",\"read\"]}");
assertEquals(Client.run(new String[]{"enforce", "-m", "examples/abac_model.conf", "-p", "examples/abac_policy.csv", "alice", "{ \"Owner\" : \"alice\" }"}), "{\"allow\":true,\"explain\":null}");
assertEquals(Client.run(new String[]{"enforceEx", "-m", "examples/abac_model.conf", "-p", "examples/abac_policy.csv", "alice", "{ \"Owner\" : \"alice\" }"}), "{\"allow\":true,\"explain\":[]}");
}

@Test
Expand Down

0 comments on commit 623968c

Please sign in to comment.