Commit 32ff9624 authored by Dominik Rosiek's avatar Dominik Rosiek

Merge branch 'master' of gitlab.telemabk.pl:jifwin/CTF

parents c7ddf1a1 9cd852c2
...@@ -8,9 +8,6 @@ import org.mongodb.morphia.annotations.Id; ...@@ -8,9 +8,6 @@ import org.mongodb.morphia.annotations.Id;
import java.security.Principal; import java.security.Principal;
/**
* Created by gpietrus on 16.02.16.
*/
@Entity("users") @Entity("users")
public class User implements Principal { public class User implements Principal {
@Id @Id
......
package com.telephoners.krakyournet.ctf.beans.tasks; package com.telephoners.krakyournet.ctf.beans.tasks;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import com.telephoners.krakyournet.ctf.beans.Flag; import com.telephoners.krakyournet.ctf.beans.Flag;
import com.telephoners.krakyournet.ctf.helpers.PublicProperty; import com.telephoners.krakyournet.ctf.helpers.PublicProperty;
...@@ -7,7 +8,8 @@ import org.bson.types.ObjectId; ...@@ -7,7 +8,8 @@ import org.bson.types.ObjectId;
import org.mongodb.morphia.annotations.Entity; import org.mongodb.morphia.annotations.Entity;
import org.mongodb.morphia.annotations.Id; import org.mongodb.morphia.annotations.Id;
import java.io.IOException; import javax.ws.rs.core.Response;
import java.net.URISyntaxException;
import java.util.List; import java.util.List;
@Entity("tasks") @Entity("tasks")
...@@ -36,8 +38,6 @@ public abstract class Task ...@@ -36,8 +38,6 @@ public abstract class Task
{ {
} }
public abstract TaskResponse getTaskResponse(TaskRequestContext taskRequestContext) throws IOException;
public String getName() public String getName()
{ {
return name; return name;
...@@ -104,4 +104,7 @@ public abstract class Task ...@@ -104,4 +104,7 @@ public abstract class Task
result = 31 * result + (flags != null ? flags.hashCode() : 0); result = 31 * result + (flags != null ? flags.hashCode() : 0);
return result; 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; package com.telephoners.krakyournet.ctf.beans.tasks;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import com.telephoners.krakyournet.ctf.beans.Flag; import com.telephoners.krakyournet.ctf.beans.Flag;
import com.telephoners.krakyournet.ctf.beans.User;
import org.mongodb.morphia.annotations.Entity; 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; import java.util.List;
@Entity("tasks") @Entity("tasks")
...@@ -22,14 +20,19 @@ public class TextTask extends Task ...@@ -22,14 +20,19 @@ public class TextTask extends Task
this.text = text; this.text = text;
} }
public String getText()
{
return text;
}
public TextTask() public TextTask()
{ {
} }
@Override @JsonIgnore
public TaskResponse getTaskResponse(TaskRequestContext taskRequestContext) throws IOException public Response getTaskResponse()
{ {
return new TaskResponse(text, new HashMap<>()); return Response.ok().entity(text).build();
} }
public void setText(String text) public void setText(String text)
......
package com.telephoners.krakyournet.ctf.beans.tasks; package com.telephoners.krakyournet.ctf.beans.tasks;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import com.telephoners.krakyournet.ctf.beans.Flag; 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 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.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Entity("tasks") @Entity("tasks")
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
...@@ -36,35 +26,13 @@ public class WebTask extends Task ...@@ -36,35 +26,13 @@ public class WebTask extends Task
{ {
} }
//todo: avoid converting in both ways @JsonIgnore
private Map<String, String> buildHeadersMap(Header[] headers) public Response getTaskResponse() throws URISyntaxException
{ {
return Stream.of(headers) return Response.seeOther(new URI(getUrl())).build();
.collect(Collectors.toMap(
Header::getName,
Header::getValue
));
} }
private Header[] buildHeadersArray(Map<String, String> headers) public String getUrl()
{
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()
{ {
return url; return url;
} }
...@@ -73,24 +41,4 @@ public class WebTask extends Task ...@@ -73,24 +41,4 @@ public class WebTask extends Task
{ {
this.url = url; 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");
}
}
} }
package com.telephoners.krakyournet.ctf.core; package com.telephoners.krakyournet.ctf.core;
/**
* Created by gpietrus on 20.02.2016.
*/
public enum TaskType { public enum TaskType {
WEB("WEB"), WEB("WEB"),
TEXT("TEXT"), TEXT("TEXT"),
......
...@@ -2,8 +2,6 @@ package com.telephoners.krakyournet.ctf.logging; ...@@ -2,8 +2,6 @@ package com.telephoners.krakyournet.ctf.logging;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.glassfish.jersey.server.ContainerRequest;
import org.glassfish.jersey.server.ContainerResponse;
import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.container.ContainerRequestFilter;
......
...@@ -33,10 +33,9 @@ public class TasksRepository extends Repository<Task> ...@@ -33,10 +33,9 @@ public class TasksRepository extends Repository<Task>
public List<Task> getAllPublic() public List<Task> getAllPublic()
{ {
List<Task> level = datastore.createQuery(Task.class) return datastore.createQuery(Task.class)
.order("level") .order("level")
.retrievedFields(true, DBObjectUtils.getPublicFields(Task.class)) .retrievedFields(true, DBObjectUtils.getPublicFields(Task.class))
.asList(); .asList();
return level;
} }
} }
\ No newline at end of file
...@@ -2,78 +2,41 @@ package com.telephoners.krakyournet.ctf.resources; ...@@ -2,78 +2,41 @@ package com.telephoners.krakyournet.ctf.resources;
import com.telephoners.krakyournet.ctf.beans.User; import com.telephoners.krakyournet.ctf.beans.User;
import com.telephoners.krakyournet.ctf.beans.tasks.Task; 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 com.telephoners.krakyournet.ctf.repositories.TasksRepository;
import io.dropwizard.auth.Auth; import io.dropwizard.auth.Auth;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.PathParam; import javax.ws.rs.PathParam;
import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.Context; import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import java.io.IOException; import java.io.IOException;
import java.net.URISyntaxException;
@Singleton @Singleton
@Path(value = "/task") @Path(value = "/task")
public class TaskResource public class TaskResource
{ {
private final TasksRepository tasksRepository; private final TasksRepository tasksRepository;
private final TaskRequestContextBuilder taskRequestContextBuilder;
@Inject @Inject
public TaskResource(TasksRepository tasksRepository, TaskRequestContextBuilder taskRequestContextBuilder) public TaskResource(TasksRepository tasksRepository)
{ {
this.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: .*}") @Path("{task_level}/{path: .*}")
@GET @GET
public Response getTaskGet(@Auth User user, public Response getTaskGet(@Auth User user,
final @PathParam("task_level") int taskLevel, final @PathParam("task_level") int taskLevel,
final @PathParam("path") String path, final @PathParam("path") String path,
@Context ContainerRequestContext containerRequestContext) throws IOException @Context ContainerRequestContext containerRequestContext) throws IOException, URISyntaxException
{ {
return handleRequest(user, taskLevel, path, containerRequestContext); Task task = tasksRepository.getByLevel(taskLevel);
} return task.getTaskResponse();
@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);
} }
} }
...@@ -27,6 +27,7 @@ public class TasksResource ...@@ -27,6 +27,7 @@ public class TasksResource
@GET @GET
public List<Task> getTasksPublic() 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