Commit 44d9ad54 authored by Grzegorz Pietrusza's avatar Grzegorz Pietrusza

inline flagchercker methods into tasksrepo

parent 5f53a626
...@@ -6,7 +6,6 @@ import com.google.inject.AbstractModule; ...@@ -6,7 +6,6 @@ import com.google.inject.AbstractModule;
import com.google.inject.Guice; import com.google.inject.Guice;
import com.google.inject.Injector; import com.google.inject.Injector;
import core.ApplicationConfiguration; import core.ApplicationConfiguration;
import core.FlagChecker;
import core.TaskType; import core.TaskType;
import database.MongoDBConnector; import database.MongoDBConnector;
import io.dropwizard.Application; import io.dropwizard.Application;
...@@ -32,7 +31,6 @@ public class CTFApplication extends Application<ApplicationConfiguration> { ...@@ -32,7 +31,6 @@ public class CTFApplication extends Application<ApplicationConfiguration> {
private UsersRepository usersRepository; //todo: refactor to injects private UsersRepository usersRepository; //todo: refactor to injects
private TasksRepository tasksRepository; //todo: refactor to injects private TasksRepository tasksRepository; //todo: refactor to injects
private FlagChecker flagChecker; //todo: inject
@Override @Override
public void run(ApplicationConfiguration applicationConfiguration, Environment environment) throws Exception { public void run(ApplicationConfiguration applicationConfiguration, Environment environment) throws Exception {
...@@ -116,18 +114,19 @@ public class CTFApplication extends Application<ApplicationConfiguration> { ...@@ -116,18 +114,19 @@ public class CTFApplication extends Application<ApplicationConfiguration> {
TeamsRepository teamsRepository = new TeamsRepository(dbConnector); TeamsRepository teamsRepository = new TeamsRepository(dbConnector);
usersRepository = new UsersRepository(dbConnector, teamsRepository); usersRepository = new UsersRepository(dbConnector, teamsRepository);
SolutionsRepository solutionsRepository = new SolutionsRepository(dbConnector); SolutionsRepository solutionsRepository = new SolutionsRepository(dbConnector);
flagChecker = new FlagChecker(applicationConfiguration, tasksRepository, teamsRepository, solutionsRepository); tasksRepository = new TasksRepository(applicationConfiguration, dbConnector, teamsRepository, solutionsRepository);
tasksRepository = new TasksRepository(dbConnector, flagChecker);
bind(FlagChecker.class).toInstance(flagChecker);
bind(TeamsRepository.class).toInstance(teamsRepository); bind(TeamsRepository.class).toInstance(teamsRepository);
bind(TasksRepository.class).toInstance(tasksRepository); bind(TasksRepository.class).toInstance(tasksRepository);
bind(UsersRepository.class).toInstance(usersRepository); bind(UsersRepository.class).toInstance(usersRepository);
bind(TeamsResource.class).toInstance(new TeamsResource(teamsRepository)); bind(TeamsResource.class).toInstance(new TeamsResource(teamsRepository));
bind(TasksResource.class).toInstance(new TasksResource(tasksRepository, teamsRepository, bind(TasksResource.class).toInstance(new TasksResource(applicationConfiguration, tasksRepository, teamsRepository,
solutionsRepository, flagChecker)); solutionsRepository));
bind(ProxyResource.class).toInstance(new ProxyResource()); bind(ProxyResource.class).toInstance(new ProxyResource());
//todo: use se methods to inject ?
//todo: or rethink classes
} }
}); });
} }
......
package api; package api;
import core.FlagChecker; import core.ApplicationConfiguration;
import io.dropwizard.auth.Auth; import io.dropwizard.auth.Auth;
import objects.Task; import objects.Task;
import objects.User; import objects.User;
...@@ -14,9 +14,8 @@ import javax.ws.rs.POST; ...@@ -14,9 +14,8 @@ import javax.ws.rs.POST;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/** /**
* Created by gpietrus on 16.02.16. * Created by gpietrus on 16.02.16.
...@@ -25,18 +24,18 @@ import java.util.stream.Collectors; ...@@ -25,18 +24,18 @@ import java.util.stream.Collectors;
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
public class TasksResource public class TasksResource
{ {
private ApplicationConfiguration applicationConfiguration;
private TasksRepository tasksRepository; private TasksRepository tasksRepository;
private TeamsRepository teamsRepository; private TeamsRepository teamsRepository;
private SolutionsRepository solutionsRepository; private SolutionsRepository solutionsRepository;
private FlagChecker flagChecker;
@Inject @Inject
public TasksResource(TasksRepository tasksRepository, TeamsRepository teamsRepository, public TasksResource(ApplicationConfiguration applicationConfiguration, TasksRepository tasksRepository, TeamsRepository teamsRepository,
SolutionsRepository solutionsRepository, FlagChecker flagChecker) { SolutionsRepository solutionsRepository) {
this.applicationConfiguration = applicationConfiguration;
this.tasksRepository = tasksRepository; this.tasksRepository = tasksRepository;
this.teamsRepository = teamsRepository; this.teamsRepository = teamsRepository;
this.solutionsRepository = solutionsRepository; this.solutionsRepository = solutionsRepository;
this.flagChecker = flagChecker;
} }
@GET @GET
...@@ -46,14 +45,14 @@ public class TasksResource ...@@ -46,14 +45,14 @@ public class TasksResource
@GET @GET
@Path("my") @Path("my")
public List<String> getUserFlags(@Auth User user) { public Collection<String> getUserFlags(@Auth User user) {
return tasksRepository.getUserFlagsHashes(user.getName()).stream().map(Map.Entry::getValue).collect(Collectors.toList()); return tasksRepository.getUserFlagsHashes(user.getName()).values();
} }
@POST @POST
public boolean submitSolution(@Auth User user, public boolean submitSolution(@Auth User user,
String flag) throws Exception { String flag) throws Exception {
return flagChecker.checkFlag(user.getName(), flag); return tasksRepository.checkFlag(user.getName(), flag);
} }
} }
package core;
import objects.Solution;
import objects.Task;
import org.apache.commons.codec.binary.Hex;
import repositories.SolutionsRepository;
import repositories.TasksRepository;
import repositories.TeamsRepository;
import javax.inject.Inject;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import java.util.Optional;
/**
* Created by gpietrus on 20.02.2016.
*/
public class FlagChecker {
private String salt = "SECURE_SALT"; //todo
private TasksRepository tasksRepository;
private TeamsRepository teamsRepository;
private SolutionsRepository solutionsRepository;
private ApplicationConfiguration applicationConfiguration;
@Inject
public FlagChecker(ApplicationConfiguration applicationConfiguration, TasksRepository tasksRepository, TeamsRepository teamsRepository, SolutionsRepository solutionsRepository) {
this.applicationConfiguration = applicationConfiguration;
this.tasksRepository = tasksRepository;
this.teamsRepository = teamsRepository;
this.solutionsRepository = solutionsRepository;
}
public String calculateHashValue(String username, String flagValue) { //todo
String combinedStrings = salt + username + flagValue; //todo
MessageDigest md5 = null;//todo: discuss
try {
md5 = MessageDigest.getInstance(applicationConfiguration.getFlagHashMethod());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
String encodedHash = Hex.encodeHexString(md5.digest(combinedStrings.getBytes()));
return encodedHash;
}
private void acceptSolution(String username, Task task) {
//todo: getname, of get id?
solutionsRepository.add(new Solution(teamsRepository.getTeamByUser(username).getName(), task.getName()));
}
private boolean compareHash(String hash, String username) throws Exception {
Optional<Map.Entry<Task, String>> matchingHash = tasksRepository.getUserFlagsHashes(username)
.stream()
.filter(taskHashEntry -> taskHashEntry.getValue().equals(hash))
.findFirst();
if (matchingHash.isPresent()) {
acceptSolution(username, matchingHash.get().getKey());
return true;
}
return false;
}
public boolean checkFlag(String username, String flagValue) throws Exception {
String hash = calculateHashValue(username, flagValue);
return compareHash(hash, username);
}
}
package repositories; package repositories;
import core.FlagChecker; import core.ApplicationConfiguration;
import database.MongoDBConnector; import database.MongoDBConnector;
import objects.Solution;
import objects.Task; import objects.Task;
import org.apache.commons.codec.binary.Hex;
import org.bson.Document; import org.bson.Document;
import javax.inject.Inject; import javax.inject.Inject;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -14,13 +18,19 @@ import java.util.stream.Collectors; ...@@ -14,13 +18,19 @@ import java.util.stream.Collectors;
*/ */
public class TasksRepository implements Repository { public class TasksRepository implements Repository {
private final FlagChecker flagChecker; private ApplicationConfiguration applicationConfiguration;
private MongoDBConnector mongoDBConnector; private MongoDBConnector mongoDBConnector;
private TeamsRepository teamsRepository;
private SolutionsRepository solutionsRepository;
private String salt = "SECURE_SALT"; //todo
@Inject @Inject
public TasksRepository(MongoDBConnector mongoDBConnector, FlagChecker flagChecker) { public TasksRepository(ApplicationConfiguration applicationConfiguration, MongoDBConnector mongoDBConnector,
TeamsRepository teamsRepository, SolutionsRepository solutionsRepository) {
this.applicationConfiguration = applicationConfiguration;
this.mongoDBConnector = mongoDBConnector; this.mongoDBConnector = mongoDBConnector;
this.flagChecker = flagChecker; this.teamsRepository = teamsRepository;
this.solutionsRepository = solutionsRepository;
} }
public void get(UUID uuid) { public void get(UUID uuid) {
...@@ -42,13 +52,48 @@ public class TasksRepository implements Repository { ...@@ -42,13 +52,48 @@ public class TasksRepository implements Repository {
mongoDBConnector.removeCollection("tasks"); mongoDBConnector.removeCollection("tasks");
} }
public Set<Map.Entry<Task, String>> getUserFlagsHashes(String username) { public Map<Task, String> getUserFlagsHashes(String username) {
return this.getAll().stream() return this.getAll().stream()
.collect(Collectors.toMap( .collect(Collectors.toMap(
task -> task, task -> task,
task -> flagChecker.calculateHashValue(username, task.getFlag().getValue()) task -> calculateHashValue(username, task.getFlag().getValue())
)) ));
.entrySet(); }
public String calculateHashValue(String username, String flagValue) { //todo
String combinedStrings = salt + username + flagValue; //todo
MessageDigest md5 = null;//todo: discuss
try {
md5 = MessageDigest.getInstance(applicationConfiguration.getFlagHashMethod());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
String encodedHash = Hex.encodeHexString(md5.digest(combinedStrings.getBytes()));
return encodedHash;
}
private void acceptSolution(String username, Task task) {
//todo: getname, of get id?
solutionsRepository.add(new Solution(teamsRepository.getTeamByUser(username).getName(), task.getName()));
}
private boolean compareHash(String hash, String username) throws Exception {
// Optional<Map.Entry<Task, String>> matchingHash = getUserFlagsHashes(username)
// .stream()
// .filter(taskHashEntry -> taskHashEntry.getValue().equals(hash))
// .findFirst();
if (getUserFlagsHashes(username).values().contains(hash)) {
// acceptSolution(username, .get().getKey());
return true;
}
return false;
}
public boolean checkFlag(String username, String flagValue) throws Exception {
// String hash = calculateHashValue(username, flagValue);
return compareHash(flagValue, username);
} }
} }
......
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