-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathAuditMiddlewareImpl.java
More file actions
71 lines (61 loc) · 2.49 KB
/
AuditMiddlewareImpl.java
File metadata and controls
71 lines (61 loc) · 2.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package com.uid2.shared.audit;
import com.uid2.shared.auth.IAuthorizable;
import io.vertx.ext.web.RoutingContext;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
public class AuditMiddlewareImpl implements IAuditMiddleware{
private final IAuditWriter auditWriter;
public AuditMiddlewareImpl(IAuditWriter writer){
this.auditWriter = writer;
}
@Override
public Function<List<OperationModel>, Boolean> handle(RoutingContext rc) {
InnerAuditHandler auditHandler = new InnerAuditHandler(rc, auditWriter);
return auditHandler::writeLogs;
}
private static class InnerAuditHandler{
private final RoutingContext rc;
private final IAuditWriter auditWriter;
private InnerAuditHandler(RoutingContext rc, IAuditWriter auditWriter) {
this.rc = rc;
this.auditWriter = auditWriter;
}
public boolean writeLogs(List<OperationModel> modelList){
String ipAddress = getIPAddress(rc);
List<IAuditModel> auditModelList = new ArrayList<>();
for(OperationModel model : modelList) {
auditModelList.add(new QLDBAuditModel(model.itemType, model.itemKey, model.actionTaken, ipAddress,
rc != null ? ((IAuthorizable) rc.data().get("api-client")).getContact() : null,
System.getenv("HOSTNAME"), Instant.now().getEpochSecond(), model.itemHash, model.summary));
}
return auditWriter.writeLogs(auditModelList);
}
private static String getIPAddress(RoutingContext rc) {
if(rc == null){
return null;
}
List<String> listIP = rc.request().headers().getAll("X-Forwarded-For");
List<InetAddress> publicIPs = new ArrayList<>();
for(String str : listIP){
try {
InetAddress address = InetAddress.getByName(str);
if(!address.isSiteLocalAddress()){
publicIPs.add(address);
}
}
catch(UnknownHostException ignored){
}
}
if(publicIPs.isEmpty()){
return rc.request().remoteAddress().toString();
}
else{
return publicIPs.get(0).getHostAddress(); //arbitrary if multiple
}
}
}
}