Commit 312ad443 authored by Michał's avatar Michał

post forward stub

parent fda85003
...@@ -38,7 +38,7 @@ public abstract class Task ...@@ -38,7 +38,7 @@ public abstract class Task
{ {
} }
public abstract TaskResponse getTaskResponse(User user, String path, ContainerRequestContext containerRequestContext) throws IOException; public abstract TaskResponse getTaskResponse(User user, String path, ContainerRequestContext containerRequestContext, String postContent) throws IOException;
public String getName() public String getName()
{ {
......
...@@ -6,13 +6,19 @@ import com.telephoners.krakyournet.ctf.beans.Flag; ...@@ -6,13 +6,19 @@ import com.telephoners.krakyournet.ctf.beans.Flag;
import com.telephoners.krakyournet.ctf.beans.User; import com.telephoners.krakyournet.ctf.beans.User;
import com.telephoners.krakyournet.ctf.helpers.StreamUtils; import com.telephoners.krakyournet.ctf.helpers.StreamUtils;
import org.apache.http.Header; import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet; 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.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.client.HttpClients;
import org.jcp.xml.dsig.internal.dom.Utils;
import org.mongodb.morphia.annotations.Entity; import org.mongodb.morphia.annotations.Entity;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.Response;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
...@@ -38,7 +44,8 @@ public class WebTask extends Task ...@@ -38,7 +44,8 @@ public class WebTask extends Task
{ {
String url = getUrl() + path; String url = getUrl() + path;
String kynHeaderValue = context.getHeaderString(KYN_HEADER_NAME); String kynHeaderValue = context.getHeaderString(KYN_HEADER_NAME);
CloseableHttpResponse response = proxyRequest(url, user, kynHeaderValue); String postContent = Utils.readBytesFromStream(context.getEntityStream()); //todo: is it working?
CloseableHttpResponse response = proxyRequest(url, user, kynHeaderValue, context.getMethod(), postContent);
String text = StreamUtils.readStream(response.getEntity().getContent()); String text = StreamUtils.readStream(response.getEntity().getContent());
Header kynHeader = response.getFirstHeader(KYN_HEADER_NAME); Header kynHeader = response.getFirstHeader(KYN_HEADER_NAME);
return new TaskResponse(text, kynHeader != null ? kynHeader.getValue() : null); //todo: needs refactorig return new TaskResponse(text, kynHeader != null ? kynHeader.getValue() : null); //todo: needs refactorig
...@@ -54,12 +61,27 @@ public class WebTask extends Task ...@@ -54,12 +61,27 @@ public class WebTask extends Task
this.url = url; this.url = url;
} }
private CloseableHttpResponse proxyRequest(String url, User user, String kynHeaderValue) throws IOException private CloseableHttpResponse proxyRequest(String url, User user, String kynHeaderValue, String httpMethod, String postContent) throws IOException
{ {
CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpget = new HttpGet(url); //todo: merge
httpget.setHeader("CTF-User", user.getName()); //todo: is it necessary? if(httpMethod.equals("GET")) {
httpget.setHeader("KYN_2016", kynHeaderValue); //todo: move to configuration HttpGet httpGet = new HttpGet(url);
return httpClient.execute(httpget); httpGet.setHeader("CTF-User", user.getName()); //todo: is it necessary?
httpGet.setHeader("KYN_2016", kynHeaderValue); //todo: move to configuration
return httpClient.execute(httpGet);
}
else if(httpMethod.equals("POST")) {
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("CTF-User", user.getName()); //todo: is it necessary?
httpPost.setHeader("KYN_2016", kynHeaderValue); //todo: move to configuration
HttpEntity entity = new ByteArrayEntity(postContent.getBytes("UTF-8"));
httpPost.setEntity(entity);
return httpClient.execute(httpPost);
}
else {
throw new WebApplicationException("no such method", Response.Status.INTERNAL_SERVER_ERROR); //todo
}
} }
} }
...@@ -10,6 +10,7 @@ import org.glassfish.jersey.server.ContainerRequest; ...@@ -10,6 +10,7 @@ import org.glassfish.jersey.server.ContainerRequest;
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;
...@@ -55,4 +56,34 @@ public class TaskResource ...@@ -55,4 +56,34 @@ public class TaskResource
} }
return responseBuilder.build(); return responseBuilder.build();
} }
@Path("{task_level}/{path: .*}")
@POST
public Response postTask(@Auth User user,
final @PathParam("task_level") int taskLevel,
final @PathParam("path") String path,
@Context ContainerRequestContext containerRequestContext) throws IOException
{
//todo: merge
Task task = tasksRepository.getByLevel(taskLevel);
//todo: refactor, path not necessary in textTasks
ContainerRequest context = (ContainerRequest) containerRequestContext;
String query = context.getRequestUri().getQuery();
String fullPath = path;
if(query != null) { //todo: refactor
fullPath = fullPath + "?" + query;
}
TaskResponse taskResponse = task.getTaskResponse(user, fullPath, containerRequestContext);
Response.ResponseBuilder responseBuilder = Response.ok();
responseBuilder.entity(taskResponse.getText());
String kynHeaderValue = taskResponse.getKynHeader();
if(kynHeaderValue != null) {
responseBuilder.header(KYN_HEADER_NAME, kynHeaderValue);
}
return responseBuilder.build();
}
} }
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