Commit bb2009d5 authored by Grzegorz Pietrusza's avatar Grzegorz Pietrusza

list of flags per task - not checked stub

parent f40fda3f
......@@ -54,21 +54,31 @@ teams:
cryptoTasks:
- name: "Szyfro1"
text: "Odszyfruj1"
flag: "asdf"
flags:
- "asdf1"
- "asdf2"
- "asdf3"
level: 1
- name: "Szyfro2"
text: "Odszyfruj2"
flag: "sdfg"
flags:
- "sdfg1"
- "sdfg2"
- "sdfg3"
level: 2
webTasks:
- name: "SQL Injection"
url: "http://google.pl"
flag: "fgh"
flags:
- "fgh1"
- "fgh2"
- "fgh3"
level: 3
- name: "Inna dziura"
url: "http://wikipedia.pl"
flag: "hjk"
flags:
- "hjk"
level: 4
package helpers;
import java.util.List;
/**
* Created by gpietrus on 23.02.2016.
*/
......@@ -7,8 +9,9 @@ public class CryptoTaskConfig {
private String name;
private int level;
private String text;
private String flag;
private List<String> flags;
//todo: refactor, map directly to Flag class?
public String getName() {
return name;
}
......@@ -33,11 +36,11 @@ public class CryptoTaskConfig {
this.text = text;
}
public String getFlag() {
return flag;
public List<String> getFlags() {
return flags;
}
public void setFlag(String flag) {
this.flag = flag;
public void setFlags(List<String> flags) {
this.flags = flags;
}
}
......@@ -8,17 +8,17 @@ import org.hibernate.validator.constraints.NotEmpty;
public class TaskUserPair {
@NotEmpty
private String taskId;
private Integer taskLevel;
@NotEmpty
private String username;
public String getTaskId() {
return taskId;
public Integer getTaskLevel() {
return taskLevel;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
public void setTaskLevel(Integer taskLevel) {
this.taskLevel = taskLevel;
}
public String getUsername() {
......
package helpers;
import java.util.List;
/**
* Created by gpietrus on 23.02.2016.
*/
......@@ -7,7 +9,7 @@ public class WebTaskConfig {
private String name;
private String url;
private int level;
private String flag;
private List<String> flags;
public String getName() {
return name;
......@@ -33,11 +35,11 @@ public class WebTaskConfig {
this.url = url;
}
public String getFlag() {
return flag;
public List<String> getFlags() {
return flags;
}
public void setFlag(String flag) {
this.flag = flag;
public void setFlags(List<String> flags) {
this.flags = flags;
}
}
......@@ -6,9 +6,8 @@ import org.bson.types.ObjectId;
import org.mongodb.morphia.annotations.Entity;
import org.mongodb.morphia.annotations.Id;
/**
* Created by gpietrus on 20.02.2016.
*/
import java.util.List;
@Entity("tasks")
public class Task {
@Id
......@@ -16,11 +15,11 @@ public class Task {
private String name;
private int level;
private TaskType taskType;
private Flag flag;
private List<Flag> flags;
private TaskContent taskContent;
public Task(String name, int level, TaskType type, Flag flag, TaskContent taskContent) {
this.flag = flag;
public Task(String name, int level, TaskType type, List<Flag> flags, TaskContent taskContent) {
this.flags = flags;
this.taskType = type;
this.level = level;
this.name = name;
......@@ -53,12 +52,12 @@ public class Task {
this.taskType = taskType;
}
public Flag getFlag() {
return flag;
public List<Flag> getFlags() {
return flags;
}
public void setFlag(Flag flag) {
this.flag = flag;
public void setFlags(List<Flag> flags) {
this.flags = flags;
}
public TaskContent getTaskContent() {
......
......@@ -71,19 +71,30 @@ public class TasksRepository implements Repository {
this.clean();
cryptoTasks.forEach(cryptoTaskConfig -> this.add(new Task(
cryptoTasks.forEach(cryptoTaskConfig -> {
cryptoTaskConfig.getFlags().stream()
.map(Flag::new)
.collect(Collectors.toList());
this.add(new Task(
cryptoTaskConfig.getName(),
cryptoTaskConfig.getLevel(),
TaskType.CRYPTO,
new Flag(cryptoTaskConfig.getFlag()),
cryptoTaskConfig.getFlags().stream()
.map(Flag::new)
.collect(Collectors.toList()),
new TaskCryptoContent(cryptoTaskConfig.getText())
)));
));
});
webTasks.forEach(webTaskConfig -> this.add(new Task(
webTaskConfig.getName(),
webTaskConfig.getLevel(),
TaskType.WEB,
new Flag(webTaskConfig.getFlag()),
webTaskConfig.getFlags().stream()
.map(Flag::new)
.collect(Collectors.toList()),
new TaskWebContent(webTaskConfig.getUrl())
)));
}
......@@ -96,11 +107,14 @@ public class TasksRepository implements Repository {
datastore.getCollection(Task.class).drop();
}
public Map<String, Task> getUserFlagsHashes(String username) {
//todo: refactor?
public Map<List<String>, Integer> getUserFlagsHashes(String username) {
return this.getAll().stream()
.collect(Collectors.toMap(
task -> calculateHashValue(username, task.getFlag().getValue()),
task -> task
task -> task.getFlags().stream()
.map(flag -> calculateHashValue(username, flag.getValue()))
.collect(Collectors.toList()),
Task::getLevel
));
}
......@@ -116,30 +130,60 @@ public class TasksRepository implements Repository {
return encodedHash;
}
private void acceptSolution(String username, Integer taskLevel) {
User user = usersRepository.getUserByName(username);
Optional<Team> team = teamsRepository.getTeamByUser(user);
Optional<Task> task = getTaskByLevel(taskLevel);
if (team.isPresent() && task.isPresent()) {
solutionsRepository.add(new Solution(team.get(), task.get().getName()));
}
}
private Optional<Task> getTaskByLevel(Integer level) {
return getAll().stream()
.filter(task -> task.getLevel() == level)
.findFirst();
}
//todo: cleanup
//todo: depracted?
private void acceptSolution(String username, Task task) {
User user = usersRepository.getUserByName(username);
Optional<Team> team = teamsRepository.getTeamByUser(user);
if(team.isPresent()) {
solutionsRepository.add(new Solution(team.get(),task.getName()));
if (team.isPresent()) {
solutionsRepository.add(new Solution(team.get(), task.getName()));
}
}
public boolean checkFlag(String username, String flagValue) throws Exception {
Task task = getUserFlagsHashes(username).get(flagValue);
if(task != null) {
acceptSolution(username, task);
private Optional<Integer> findTaskLevelByFlag(String username, String flagValue) {
return getUserFlagsHashes(username).entrySet()
.stream()
.filter(flagsMapEntry -> flagsMapEntry.getKey().contains(flagValue))
.map(Map.Entry::getValue)
.findFirst();
}
public boolean checkFlag(String username, String flagValue) {
Optional<Integer> taskLevel = findTaskLevelByFlag(username, flagValue);
if (taskLevel.isPresent()) {
acceptSolution(username, taskLevel.get());
return true;
}
return false;
}
public Optional<String> getUserTaskFlag(String username, String taskId) {
//todo: taskId, level, name? discuss
public Optional<List<String>> getUserTaskFlags(String username, Integer taskLevel) { //todo: task level, task id
return getUserFlagsHashes(username).entrySet().stream()
.filter(taskEntry -> taskEntry.getValue().getName().equals(taskId))
.map(taskEntry -> calculateHashValue(username, taskEntry.getValue().getFlag().getValue()))
.filter(taskEntry -> taskEntry.getValue().equals(taskLevel))
.map(listIntegerEntry -> {
Integer taskLevel1 = listIntegerEntry.getValue();
Task task = getTaskByLevel(taskLevel1).get();
List<String> flags = task.getFlags()
.stream()
.map(flag -> calculateHashValue(username, flag.getValue()))
.collect(Collectors.toList());
return flags;
})
.findFirst();
}
}
\ No newline at end of file
//todo: generify!
\ No newline at end of file
......@@ -14,7 +14,9 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* Created by gpietrus on 16.02.16.
......@@ -39,7 +41,11 @@ public class TasksResource
@GET
@Path("my")
public Collection<String> getUserFlags(@Auth User user) {
return tasksRepository.getUserFlagsHashes(user.getName()).keySet();
Map<List<String>, Integer> userFlagsHashes = tasksRepository.getUserFlagsHashes(user.getName());
return userFlagsHashes.entrySet()
.stream()
.flatMap(listIntegerEntry -> listIntegerEntry.getKey().stream())
.collect(Collectors.toList());
}
//todo: merge with upper
......@@ -49,9 +55,10 @@ public class TasksResource
@Path("/flags/user_task_flag")
@Consumes(MediaType.APPLICATION_JSON)
public Response getUserTaskFlag(@Valid final TaskUserPair taskUserPair) {
Optional<String> userTaskFlag = tasksRepository.getUserTaskFlag(taskUserPair.getUsername(), taskUserPair.getTaskId());//todo
if(userTaskFlag.isPresent()) {
return Response.ok().entity(userTaskFlag.get()).build();
Optional<List<String>> userTaskFlags = tasksRepository.getUserTaskFlags(taskUserPair.getUsername(), taskUserPair.getTaskLevel());//todo
if(userTaskFlags.isPresent()) {
return Response.ok().entity(userTaskFlags.get()).build();
}
return Response.status(Response.Status.BAD_REQUEST).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