Commit 85c2a78f authored by Grzegorz Pietrusza's avatar Grzegorz Pietrusza

remove proxy features

parent 28b4d09d
package com.telephoners.krakyournet.ctf.beans.tasks;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.telephoners.krakyournet.ctf.beans.Flag;
import com.telephoners.krakyournet.ctf.helpers.PublicProperty;
......@@ -7,7 +8,8 @@ import org.bson.types.ObjectId;
import org.mongodb.morphia.annotations.Entity;
import org.mongodb.morphia.annotations.Id;
import java.io.IOException;
import javax.ws.rs.core.Response;
import java.net.URISyntaxException;
import java.util.List;
@Entity("tasks")
......@@ -36,8 +38,6 @@ public abstract class Task
{
}
public abstract TaskResponse getTaskResponse(TaskRequestContext taskRequestContext) throws IOException;
public String getName()
{
return name;
......@@ -104,4 +104,7 @@ public abstract class Task
result = 31 * result + (flags != null ? flags.hashCode() : 0);
return result;
}
@JsonIgnore
public abstract Response getTaskResponse() throws URISyntaxException;
}
package com.telephoners.krakyournet.ctf.beans.tasks;
import com.telephoners.krakyournet.ctf.beans.User;
import org.eclipse.jetty.http.HttpMethod;
import java.util.Map;
public class TaskRequestContext
{
private HttpMethod httpMethod;
private User user;
private String path;
private String body;
private Map<String, String> headers;
public TaskRequestContext withHttpMethod(HttpMethod httpMethod)
{
this.httpMethod = httpMethod;
return this;
}
public TaskRequestContext withUser(User user)
{
this.user = user;
return this;
}
public TaskRequestContext withPath(String path)
{
this.path = path;
return this;
}
public TaskRequestContext withBody(String body) {
this.body = body;
return this;
}
public TaskRequestContext withHeaders(Map<String, String> headers) {
this.headers = headers;
return this;
}
public HttpMethod getHttpMethod()
{
return httpMethod;
}
public User getUser()
{
return user;
}
public String getPath()
{
return path;
}
public String getBody()
{
return body;
}
public Map<String, String> getHeaders()
{
return headers;
}
}
package com.telephoners.krakyournet.ctf.beans.tasks;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.telephoners.krakyournet.ctf.beans.User;
import com.telephoners.krakyournet.ctf.core.ApplicationConfiguration;
import com.telephoners.krakyournet.ctf.helpers.StreamUtils;
import org.eclipse.jetty.http.HttpMethod;
import org.glassfish.jersey.server.ContainerRequest;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.MultivaluedMap;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@Singleton
public class TaskRequestContextBuilder
{
private ApplicationConfiguration applicationConfiguration;
@Inject
public TaskRequestContextBuilder(ApplicationConfiguration applicationConfiguration)
{
this.applicationConfiguration = applicationConfiguration;
}
private Map<String, String> extractProxiedHeaders(MultivaluedMap<String, String> headers)
{
Set<String> proxiedHeaders = applicationConfiguration.getProxiedHeaders();
return headers.entrySet()
.stream()
.filter(header -> proxiedHeaders.contains(header.getKey()))
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().get(0) //todo: check
));
}
public TaskRequestContext from(User user, String path, ContainerRequestContext containerRequestContext) throws IOException
{
String fullPath = path;
TaskRequestContext taskRequestContext = new TaskRequestContext();
if (user != null) {
taskRequestContext.withUser(user);
}
if (path != null) {
taskRequestContext.withPath(path);
String httpMethod = containerRequestContext.getMethod();
String query = ((ContainerRequest) containerRequestContext).getRequestUri().getQuery();
if (query != null) {
fullPath += "?" + query;
}
taskRequestContext.withPath(fullPath);
if(httpMethod.equals("GET")) {
taskRequestContext.withHttpMethod(HttpMethod.GET);
}
else if (httpMethod.equals("POST")) {
taskRequestContext.withHttpMethod(HttpMethod.POST);
String body = StreamUtils.readStream(containerRequestContext.getEntityStream());
taskRequestContext.withBody(body);
}
else {
throw new IllegalStateException("Invalid http method");
}
Map<String, String> proxiedHeaders = extractProxiedHeaders(containerRequestContext.getHeaders());
taskRequestContext.withHeaders(proxiedHeaders);
}
return taskRequestContext;
}
}
package com.telephoners.krakyournet.ctf.beans.tasks;
import java.util.Map;
public class TaskResponse
{
private String text;
private Map<String, String> headers;
public TaskResponse(String text, Map<String,String> headers)
{
this.text = text;
this.headers = headers;
}
public String getText()
{
return text;
}
public Map<String, String> getHeaders()
{
return headers;
}
}
\ No newline at end of file
package com.telephoners.krakyournet.ctf.beans.tasks;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.telephoners.krakyournet.ctf.beans.Flag;
import com.telephoners.krakyournet.ctf.beans.User;
import org.mongodb.morphia.annotations.Entity;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
......@@ -22,14 +22,19 @@ public class TextTask extends Task
this.text = text;
}
public String getText()
{
return text;
}
public TextTask()
{
}
@Override
public TaskResponse getTaskResponse(TaskRequestContext taskRequestContext) throws IOException
@JsonIgnore
public Response getTaskResponse()
{
return new TaskResponse(text, new HashMap<>());
return Response.ok().entity(text).build();
}
public void setText(String text)
......
package com.telephoners.krakyournet.ctf.beans.tasks;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.telephoners.krakyournet.ctf.beans.Flag;
import com.telephoners.krakyournet.ctf.helpers.StreamUtils;
import org.apache.http.Header;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.eclipse.jetty.http.HttpMethod;
import org.mongodb.morphia.annotations.Entity;
import java.io.IOException;
import javax.ws.rs.core.Response;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Entity("tasks")
@JsonInclude(JsonInclude.Include.NON_NULL)
......@@ -36,35 +26,13 @@ public class WebTask extends Task
{
}
//todo: avoid converting in both ways
private Map<String, String> buildHeadersMap(Header[] headers)
@JsonIgnore
public Response getTaskResponse() throws URISyntaxException
{
return Stream.of(headers)
.collect(Collectors.toMap(
Header::getName,
Header::getValue
));
return Response.seeOther(new URI(getUrl())).build();
}
private Header[] buildHeadersArray(Map<String, String> headers)
{
List<BasicHeader> headersList = headers.entrySet().stream() //todo: dirty casting
.map(headerEntry -> new BasicHeader(headerEntry.getKey(), headerEntry.getValue()))
.collect(Collectors.toList());
Header[] headersArray = new Header[headersList.size()];
return headersList.toArray(headersArray);
}
@Override
public TaskResponse getTaskResponse(TaskRequestContext taskRequestContext) throws IOException
{
String proxiedUrl = getTaskUrl() + taskRequestContext.getPath();
CloseableHttpResponse response = proxyRequest(proxiedUrl, taskRequestContext);
String text = StreamUtils.readStream(response.getEntity().getContent());
return new TaskResponse(text, buildHeadersMap(response.getAllHeaders()));
}
public String getTaskUrl()
public String getUrl()
{
return url;
}
......@@ -73,24 +41,4 @@ public class WebTask extends Task
{
this.url = url;
}
private CloseableHttpResponse proxyRequest(String url, TaskRequestContext taskRequestContext) throws IOException
{
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpMethod httpMethod = taskRequestContext.getHttpMethod();
if (httpMethod.equals(HttpMethod.GET)) {
HttpGet httpget = new HttpGet(url);
httpget.setHeaders(buildHeadersArray(taskRequestContext.getHeaders()));
return httpClient.execute(httpget);
} else if (httpMethod.equals(HttpMethod.POST)) {
HttpPost httpPost = new HttpPost(url);
httpPost.setHeaders(buildHeadersArray(taskRequestContext.getHeaders()));
httpPost.setEntity(new ByteArrayEntity(taskRequestContext.getBody().getBytes("UTF-8")));
return httpClient.execute(httpPost);
} else {
throw new IllegalStateException("Invalid http method");
}
}
}
......@@ -33,10 +33,9 @@ public class TasksRepository extends Repository<Task>
public List<Task> getAllPublic()
{
List<Task> level = datastore.createQuery(Task.class)
return datastore.createQuery(Task.class)
.order("level")
.retrievedFields(true, DBObjectUtils.getPublicFields(Task.class))
.asList();
return level;
}
}
\ No newline at end of file
......@@ -2,78 +2,41 @@ package com.telephoners.krakyournet.ctf.resources;
import com.telephoners.krakyournet.ctf.beans.User;
import com.telephoners.krakyournet.ctf.beans.tasks.Task;
import com.telephoners.krakyournet.ctf.beans.tasks.TaskRequestContext;
import com.telephoners.krakyournet.ctf.beans.tasks.TaskRequestContextBuilder;
import com.telephoners.krakyournet.ctf.beans.tasks.TaskResponse;
import com.telephoners.krakyournet.ctf.repositories.TasksRepository;
import io.dropwizard.auth.Auth;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.net.URISyntaxException;
@Singleton
@Path(value = "/task")
public class TaskResource
{
private final TasksRepository tasksRepository;
private final TaskRequestContextBuilder taskRequestContextBuilder;
@Inject
public TaskResource(TasksRepository tasksRepository, TaskRequestContextBuilder taskRequestContextBuilder)
public TaskResource(TasksRepository tasksRepository)
{
this.tasksRepository = tasksRepository;
this.taskRequestContextBuilder = taskRequestContextBuilder;
}
private Response buildResponse(TaskResponse taskResponse)
{
Response.ResponseBuilder responseBuilder = Response.ok();
responseBuilder.entity(taskResponse.getText());
taskResponse.getHeaders()
.entrySet()
.stream()
.forEach(headerEntry -> {
responseBuilder.header(headerEntry.getKey(), headerEntry.getValue());
});
return responseBuilder.build();
}
private Response handleRequest(User user,
int taskLevel,
String path,
ContainerRequestContext containerRequestContext) throws IOException
{
Task task = tasksRepository.getByLevel(taskLevel);
TaskRequestContext taskRequestContext = taskRequestContextBuilder.from(user, path, containerRequestContext);
return buildResponse(task.getTaskResponse(taskRequestContext));
}
@Path("{task_level}/{path: .*}")
@GET
public Response getTaskGet(@Auth User user,
final @PathParam("task_level") int taskLevel,
final @PathParam("path") String path,
@Context ContainerRequestContext containerRequestContext) throws IOException
@Context ContainerRequestContext containerRequestContext) throws IOException, URISyntaxException
{
return handleRequest(user, taskLevel, path, containerRequestContext);
}
@Path("{task_level}/{path: .*}")
@POST
public Response getTaskPost(@Auth User user,
final @PathParam("task_level") int taskLevel,
final @PathParam("path") String path,
@Context ContainerRequestContext containerRequestContext) throws IOException
{
return handleRequest(user, taskLevel, path, containerRequestContext);
Task task = tasksRepository.getByLevel(taskLevel);
return task.getTaskResponse();
}
}
......@@ -27,6 +27,7 @@ public class TasksResource
@GET
public List<Task> getTasksPublic()
{
return tasksRepository.getAllPublic();
List<Task> allPublic = tasksRepository.getAllPublic();
return allPublic;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment