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