Skip to content

Commit 670ae01

Browse files
committed
Fixed JsonLd as verification input. Check participant exists before verifying.
1 parent 059c633 commit 670ae01

2 files changed

Lines changed: 36 additions & 7 deletions

File tree

federated-catalog/src/main/java/org/eclipse/edc/heleade/federated/catalog/extension/api/node/directory/ParticipantNode.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ public static Map<String, Object> getMapFromArrayJsonObject(JsonObject jsonObje
386386
* @param key the key in the JSON object whose value is an array of JSON objects
387387
* @return a map where keys are the "@id" values and values are the "@value" values from the array's JSON objects
388388
*/
389-
public static Map<String, String> getStringMapFromJsonObject(JsonObject jsonObject, String key) {
389+
public static Map<String, String> getStringMapFromJsonObject(JsonObject jsonObject, String key) {
390390
Map<String, String> results = new HashMap<>();
391391
if (jsonObject.containsKey(key)) {
392392
JsonObject object = jsonObject.getJsonObject(key);
@@ -428,8 +428,12 @@ public static Map<String, String> getStringMapFromArrayJsonObject(JsonObject js
428428

429429
/**
430430
* Helper method to extract a string value from a JSON object.
431+
*
432+
* @param jsonObject the JSON object containing the target array
433+
* @param key the key in the JSON object whose value is an array of JSON objects
434+
* @return the extracted string values
431435
*/
432-
private static String getStringValue(JsonObject jsonObject, String key) {
436+
public static String getStringValue(JsonObject jsonObject, String key) {
433437
if (jsonObject.containsKey(key)) {
434438
var valueArray = jsonObject.getJsonArray(key);
435439
if (valueArray != null && !valueArray.isEmpty()) {

federated-catalog/src/main/java/org/eclipse/edc/heleade/federated/catalog/extension/api/verification/VerificationApiController.java

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838

3939
import static org.eclipse.edc.heleade.commons.verification.claims.Claims.verifyClaims;
4040
import static org.eclipse.edc.heleade.commons.verification.claims.Claims.verifySignature;
41+
import static org.eclipse.edc.heleade.federated.catalog.extension.api.node.directory.ParticipantNode.getMapFromArrayJsonObject;
42+
import static org.eclipse.edc.heleade.federated.catalog.extension.api.node.directory.ParticipantNode.getStringValue;
4143
import static org.eclipse.edc.spi.constants.CoreConstants.EDC_NAMESPACE;
4244

4345

@@ -89,15 +91,25 @@ public JsonObject verify(String body) {
8991
JsonObject jsonBody = jsonReader.readObject();
9092
jsonReader.close();
9193

94+
JsonObject jsonLdBody = jsonLd.expand(jsonBody).getContent();
95+
9296
// get the inputs from the body
93-
String id = jsonBody.getString(EDC_NAMESPACE + "participantId");
94-
String participantSignedClaims = jsonBody.getString(EDC_NAMESPACE + "signedClaims");
95-
Map<String, Object> participantClaims = getMapFromJsonObject(jsonBody.getJsonObject(EDC_NAMESPACE + "claims"));
96-
JsonObject participantClaimsJson = jsonBody.getJsonObject(EDC_NAMESPACE + "claims");
97+
String id = getStringValue(jsonLdBody, EDC_NAMESPACE + "participantId");
98+
String participantSignedClaims = getStringValue(jsonLdBody, EDC_NAMESPACE + "signedClaims");
99+
Map<String, Object> participantClaims = getMapFromArrayJsonObject(jsonLdBody, EDC_NAMESPACE + "claims");
100+
JsonObject participantClaimsJson = getJsonObjectFromStringMap(participantClaims);
97101
String claimsString = participantClaimsJson.toString();
98102

99-
// check the signature
103+
// check participant is registered
100104
ParticipantNode participantNode = targetNodeDirectory.getParticipantNode(id);
105+
if (participantNode == null) {
106+
return Json.createObjectBuilder()
107+
.add("error", "Participant not registered in federated catalog")
108+
.add("verifySignatureSuccess", false)
109+
.add("verifyClaimsSuccess", false).build();
110+
}
111+
112+
// check the signature
101113
String pem = participantNode.security().get(EDC_NAMESPACE + "pem");
102114
boolean verifySignatureSuccess = verifySignature(typeManager.getMapper(), pem, participantSignedClaims, claimsString);
103115
JsonObjectBuilder builder = Json.createObjectBuilder();
@@ -113,6 +125,19 @@ public JsonObject verify(String body) {
113125
return builder.build();
114126
}
115127

128+
private JsonObject getJsonObjectFromStringMap(Map<String, Object> map) {
129+
JsonObjectBuilder builder = Json.createObjectBuilder();
130+
for (String key : map.keySet()) {
131+
Object value = map.get(key);
132+
if (value instanceof String) {
133+
builder.add(key, (String) value);
134+
} else {
135+
throw new IllegalArgumentException("Invalid type for key: " + key);
136+
}
137+
}
138+
return builder.build();
139+
}
140+
116141
private Map<String, Object> getMapFromJsonObject(JsonObject jsonObject) {
117142
Map<String, Object> map = new HashMap<String, Object>();
118143
for (String key : jsonObject.keySet()) {

0 commit comments

Comments
 (0)