diff --git a/src/main/groovy/io/kamax/mxisd/controller/v1/MappingController.groovy b/src/main/groovy/io/kamax/mxisd/controller/v1/MappingController.groovy index 45bd0f2..050914b 100644 --- a/src/main/groovy/io/kamax/mxisd/controller/v1/MappingController.groovy +++ b/src/main/groovy/io/kamax/mxisd/controller/v1/MappingController.groovy @@ -22,6 +22,7 @@ package io.kamax.mxisd.controller.v1 import groovy.json.JsonOutput import groovy.json.JsonSlurper +import io.kamax.mxisd.lookup.ALookupRequest import io.kamax.mxisd.lookup.BulkLookupRequest import io.kamax.mxisd.lookup.SingleLookupRequest import io.kamax.mxisd.lookup.ThreePidMapping @@ -52,16 +53,24 @@ class MappingController { @Autowired private SignatureManager signMgr + private void setRequesterInfo(ALookupRequest lookupReq, HttpServletRequest req) { + lookupReq.setRequester(req.getRemoteAddr()) + String xff = req.getHeader("X-FORWARDED-FOR") + lookupReq.setRecursive(StringUtils.isNotBlank(xff)) + if (lookupReq.isRecursive()) { + lookupReq.setRecurseHosts(Arrays.asList(xff.split(","))) + } + } + @RequestMapping(value = "/_matrix/identity/api/v1/lookup", method = GET) String lookup(HttpServletRequest request, @RequestParam String medium, @RequestParam String address) { - String remote = StringUtils.defaultIfBlank(request.getHeader("X-FORWARDED-FOR"), request.getRemoteAddr()) - log.info("Got request from {}", remote) - SingleLookupRequest lookupRequest = new SingleLookupRequest() - lookupRequest.setRequester(remote) + setRequesterInfo(lookupRequest, request) lookupRequest.setType(medium) lookupRequest.setThreePid(address) + log.info("Got request from {} - Is recursive? {}", lookupRequest.getRequester(), lookupRequest.isRecursive()) + Optional lookupOpt = strategy.find(lookupRequest) if (!lookupOpt.isPresent()) { log.info("No mapping was found, return empty JSON object") @@ -79,11 +88,9 @@ class MappingController { @RequestMapping(value = "/_matrix/identity/api/v1/bulk_lookup", method = POST) String bulkLookup(HttpServletRequest request) { - String remote = StringUtils.defaultIfBlank(request.getHeader("X-FORWARDED-FOR"), request.getRemoteAddr()) - log.info("Got request from {}", remote) - BulkLookupRequest lookupRequest = new BulkLookupRequest() - lookupRequest.setRequester(remote) + setRequesterInfo(lookupRequest, request) + log.info("Got request from {} - Is recursive? {}", lookupRequest.getRequester(), lookupRequest.isRecursive()) ClientBulkLookupRequest input = (ClientBulkLookupRequest) json.parseText(request.getInputStream().getText()) List mappings = new ArrayList<>() diff --git a/src/main/groovy/io/kamax/mxisd/lookup/ALookupRequest.java b/src/main/groovy/io/kamax/mxisd/lookup/ALookupRequest.java index 58aa305..a668fd8 100644 --- a/src/main/groovy/io/kamax/mxisd/lookup/ALookupRequest.java +++ b/src/main/groovy/io/kamax/mxisd/lookup/ALookupRequest.java @@ -20,9 +20,22 @@ package io.kamax.mxisd.lookup; +import java.util.List; + public abstract class ALookupRequest { + private String id; private String requester; + private boolean isRecursive; + private List recurseHosts; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } public String getRequester() { return requester; @@ -32,4 +45,20 @@ public abstract class ALookupRequest { this.requester = requester; } + public boolean isRecursive() { + return isRecursive; + } + + public void setRecursive(boolean recursive) { + isRecursive = recursive; + } + + public List getRecurseHosts() { + return recurseHosts; + } + + public void setRecurseHosts(List recurseHosts) { + this.recurseHosts = recurseHosts; + } + }