Skip to content

Commit e9f68d7

Browse files
authored
Merge pull request #322 from holashchand/issue-1010
[FEAT]: added support for vc for audit logs
2 parents 0f48456 + e898dbf commit e9f68d7

File tree

7 files changed

+66
-9
lines changed

7 files changed

+66
-9
lines changed

java/middleware-commons/src/main/java/dev/sunbirdrc/registry/middleware/util/JSONUtil.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,21 @@ public static ObjectNode getSearchPageUrls(JsonNode inputNode, long defaultLimit
569569
return result;
570570
}
571571

572+
public static ObjectNode getRootSearchPageUrls(JsonNode inputNode, long defaultLimit, long defaultOffset, long totalCount, String url) throws IOException {
573+
ObjectNode result = JsonNodeFactory.instance.objectNode();
574+
JsonNode searchNode = objectMapper.readTree(inputNode.toString());
575+
String entityName = searchNode.fieldNames().next();
576+
long limit = searchNode.get(entityName).get(LIMIT) == null ? defaultLimit : searchNode.get(entityName).get(LIMIT).asLong(defaultLimit);
577+
long offset = searchNode.get(entityName).get(OFFSET) == null ? defaultOffset : searchNode.get(entityName).get(OFFSET).asLong(defaultOffset);
578+
((ObjectNode) searchNode.at("/" + entityName)).set(OFFSET, JsonNodeFactory.instance.numberNode(offset - limit));
579+
String prevPageToken = Base64.getEncoder().encodeToString(searchNode.toString().getBytes(StandardCharsets.UTF_8));
580+
((ObjectNode) searchNode.at("/" + entityName)).set(OFFSET, JsonNodeFactory.instance.numberNode(offset + limit));
581+
String nextPageToken = Base64.getEncoder().encodeToString(searchNode.toString().getBytes(StandardCharsets.UTF_8));
582+
if(offset - limit >=0) result.put(PREV_PAGE, url + "?search=" + prevPageToken);
583+
if(offset + limit < totalCount) result.put(NEXT_PAGE, url + "?search=" + nextPageToken);
584+
return result;
585+
}
586+
572587
public static ObjectNode parseSearchToken(String endcodedValue) {
573588
try {
574589
byte[] decoded = Base64.getDecoder().decode(endcodedValue);

java/registry/src/main/java/dev/sunbirdrc/registry/controller/RegistryUtilsController.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.sunbirdrc.registry.controller;
22

33
import com.fasterxml.jackson.databind.JsonNode;
4+
import com.fasterxml.jackson.databind.node.ObjectNode;
45
import com.google.common.io.ByteStreams;
56
import com.google.gson.Gson;
67
import com.google.gson.JsonArray;
@@ -40,6 +41,8 @@
4041
import java.util.List;
4142
import java.util.Map;
4243

44+
import static dev.sunbirdrc.registry.middleware.util.Constants.TOTAL_COUNT;
45+
4346
@RestController
4447
public class RegistryUtilsController {
4548

@@ -80,6 +83,11 @@ public class RegistryUtilsController {
8083
@Value("${audit.frame.store}")
8184
public String auditStoreType;
8285

86+
@Value("${search.offset:0}")
87+
private int searchOffset;
88+
@Value("${search.limit:2000}")
89+
private int searchLimit;
90+
8391
@RequestMapping(value = "/utils/sign", method = RequestMethod.POST)
8492
public ResponseEntity<Response> generateSignature(HttpServletRequest requestModel) {
8593
ResponseParams responseParams = new ResponseParams();
@@ -269,16 +277,21 @@ public ResponseEntity<Response> registryHealth() {
269277
}
270278

271279
@ResponseBody
272-
@RequestMapping(value = "/audit", method = RequestMethod.POST)
273-
public ResponseEntity<Response> fetchAudit() {
280+
@RequestMapping(value = "/audit", method = {RequestMethod.POST, RequestMethod.GET})
281+
public ResponseEntity<Response> fetchAudit(HttpServletRequest request, @RequestParam(value = "search", required = false) String searchQueryString) {
274282
ResponseParams responseParams = new ResponseParams();
275283
Response response = new Response(Response.API_ID.AUDIT, "OK", responseParams);
276284
JsonNode payload = apiMessage.getRequest().getRequestMapNode();
285+
if(searchQueryString != null) {
286+
payload = JSONUtil.parseSearchToken(searchQueryString);
287+
}
277288
if (auditEnabled && Constants.DATABASE.equals(auditStoreType)) {
278289
try {
279290
watch.start("RegistryController.audit");
280291
JsonNode result = registryHelper.getAuditLog(payload, null);
281-
292+
String resultEntity = result.fieldNames().next();
293+
ObjectNode pageUrls = JSONUtil.getRootSearchPageUrls(payload, searchLimit, searchOffset, result.get(resultEntity).get(TOTAL_COUNT).asLong(), request.getRequestURL().toString());
294+
((ObjectNode) result.get(resultEntity)).setAll(pageUrls);
282295
response.setResult(result);
283296
responseParams.setStatus(Response.Status.SUCCESSFUL);
284297
watch.stop("RegistryController.searchEntity");

java/registry/src/main/java/dev/sunbirdrc/registry/service/impl/AuditDBImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public void doAudit(AuditRecord auditRecord, JsonNode inputNode, Shard shard) {
5757
}
5858

5959
JsonNode rootNode = convertAuditRecordToJson(auditRecord, entityType);
60+
signAudit(entityType, rootNode);
6061
auditToDB(rootNode, entityType, shard);
6162

6263
} catch (AuditFailedException e) {

java/registry/src/main/java/dev/sunbirdrc/registry/service/impl/AuditFileImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ public void doAudit(AuditRecord auditRecord, JsonNode inputNode, Shard shard) th
3333
try {
3434
// If the audit is stored as file, fetchAudit from audit entity will not come to this point.
3535
AuditFileWriter auditWriter = new AuditFileWriter();
36-
auditWriter.auditToFile(auditRecord);
36+
JsonNode rootNode = convertAuditRecordToJson(auditRecord, auditRecord.getEntityType());
37+
signAudit(auditRecord.getEntityType(), rootNode);
38+
auditWriter.auditToFile(rootNode);
3739

3840
// sendAuditToActor(auditRecord, inputNode, auditRecord.getEntityType());
3941
} catch (Exception e) {
@@ -45,7 +47,6 @@ public void doAudit(AuditRecord auditRecord, JsonNode inputNode, Shard shard) th
4547

4648
@Override
4749
public String getAuditProvider() {
48-
4950
return Constants.FILE;
5051
}
5152
}

java/registry/src/main/java/dev/sunbirdrc/registry/service/impl/AuditServiceImpl.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package dev.sunbirdrc.registry.service.impl;
22

33
import java.io.IOException;
4-
import java.util.ArrayList;
5-
import java.util.Arrays;
6-
import java.util.List;
4+
import java.util.*;
75

6+
import dev.sunbirdrc.registry.config.GenericConfiguration;
87
import dev.sunbirdrc.registry.exception.AuditFailedException;
8+
import dev.sunbirdrc.registry.exception.SignatureException;
9+
import dev.sunbirdrc.registry.helper.SignatureHelper;
10+
import dev.sunbirdrc.registry.middleware.util.OSSystemFields;
911
import org.apache.commons.lang3.exception.ExceptionUtils;
1012
import org.slf4j.Logger;
1113
import org.slf4j.LoggerFactory;
@@ -58,6 +60,9 @@ public class AuditServiceImpl implements IAuditService {
5860
@Value("${audit.frame.suffixSeparator}")
5961
private String auditSuffixSeparator;
6062

63+
@Value("${audit.vc-enabled:false}")
64+
private boolean auditVCEnabled;
65+
6166
@Autowired
6267
private IDefinitionsManager definitionsManager;
6368

@@ -67,6 +72,12 @@ public class AuditServiceImpl implements IAuditService {
6772
@Autowired
6873
private AuditProviderFactory auditProviderFactory;
6974

75+
@Autowired(required = false)
76+
private SignatureHelper signatureHelper;
77+
78+
@Value("${signature.enabled:false}")
79+
private boolean signatureEnabled;
80+
7081

7182
@Value("${search.providerName}")
7283
private String searchProvider;
@@ -177,5 +188,18 @@ public String getAuditProvider() {
177188
return null;
178189
}
179190

191+
protected void signAudit(String entityType, JsonNode rootNode) throws SignatureException.CreationException, SignatureException.UnreachableException {
192+
if(signatureEnabled && auditVCEnabled) {
193+
Object credentialTemplate = definitionsManager.getCredentialTemplate(entityType);
194+
if(credentialTemplate == null || credentialTemplate.toString().isEmpty()) return;
195+
Map<String, Object> requestBodyMap = new HashMap<>();
196+
requestBodyMap.put("title", entityType);
197+
requestBodyMap.put("data", rootNode.get(entityType));
198+
requestBodyMap.put("credentialTemplate", credentialTemplate);
199+
Object signedCredentials = signatureHelper.sign(requestBodyMap);
200+
OSSystemFields.credentials.setCredential(GenericConfiguration.getSignatureProvider(), rootNode.get(entityType), signedCredentials);
201+
}
202+
}
203+
180204

181205
}

java/registry/src/main/java/dev/sunbirdrc/registry/util/AuditFileWriter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.sunbirdrc.registry.util;
22

3+
import com.fasterxml.jackson.databind.JsonNode;
34
import org.slf4j.Logger;
45
import org.slf4j.LoggerFactory;
56
import org.springframework.beans.factory.annotation.Autowired;
@@ -19,7 +20,7 @@ public class AuditFileWriter {
1920
private static Logger logger = LoggerFactory.getLogger(AuditFileWriter.class);
2021

2122
@Async("auditExecutor")
22-
public void auditToFile(AuditRecord auditRecord) throws JsonProcessingException {
23+
public void auditToFile(JsonNode auditRecord) throws JsonProcessingException {
2324
ObjectMapper objectMapper = new ObjectMapper();
2425
String auditString = objectMapper.writeValueAsString(auditRecord);
2526
logger.info("{}", auditString);

java/registry/src/main/resources/application.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ certificate:
233233
# Note : Database Stores the created audit schema in audit_schema folder.
234234
audit:
235235
enabled: ${audit_enabled:true}
236+
vc-enabled: ${audit_vc_enabled:false}
236237
frame:
237238
store: ${audit_frame_store:DATABASE}
238239
suffix: ${audit_suffix:Audit}
@@ -473,6 +474,7 @@ signature:
473474

474475
audit:
475476
enabled: ${audit_enabled:false}
477+
vc-enabled: ${audit_vc_enabled:false}
476478
frame:
477479
store: ${audit_frame_store:DATABASE}
478480
suffix: ${audit_suffix:Audit}

0 commit comments

Comments
 (0)