Remove unused method, organize imports and format all files

This commit is contained in:
Francois G 2023-04-09 08:40:13 +02:00
parent 611b45a5bd
commit 109ab984b3
29 changed files with 650 additions and 690 deletions

View file

@ -33,13 +33,15 @@ public class Configuration {
}
public void load() throws Exception {
if(!this._file.exists()) return;
if (!this._file.exists())
return;
BufferedReader reader = new BufferedReader(new FileReader(this._file));
String line;
while ((line = reader.readLine()) != null) {
String[] split = line.split("=");
Field field = getClass().getDeclaredField(split[0]);
if(field == null) continue;
if (field == null)
continue;
field.setAccessible(true);
injectValue(field, split[1]);
}
@ -73,7 +75,8 @@ public class Configuration {
case "short":
field.setShort(this, Short.parseShort(value));
break;
default: throw new IllegalArgumentException(value);
default:
throw new IllegalArgumentException(value);
}
return;
}
@ -87,14 +90,16 @@ public class Configuration {
public void save() throws Exception {
if (!_file.exists()) {
File parent = _file.getParentFile();
if(!parent.exists()) parent.mkdirs();
if (!parent.exists())
parent.mkdirs();
_file.createNewFile();
}
Field[] fields = getClass().getDeclaredFields();
BufferedWriter writer = new BufferedWriter(new FileWriter(_file));
for (Field field : fields) {
field.setAccessible(true);
if(field.getName().startsWith("_")) continue;
if (field.getName().startsWith("_"))
continue;
Object value = field.get(this);
writer.write(field.getName() + "=" + value);
}

View file

@ -40,7 +40,8 @@ public class Main {
Class.forName("com.mysql.cj.jdbc.Driver");
Router router = new Router(new DatabaseRepository(config), config.getTokenIssuer(), config.getTokenExpiration());
Router router = new Router(new DatabaseRepository(config), config.getTokenIssuer(),
config.getTokenExpiration());
router.setDefault(new Response() {
@Override
@ -56,10 +57,8 @@ public class Main {
@Route(path = "^(.*)$", type = "OPTIONS")
@Override
public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception {
HttpUtil.responseHeaders(writer, 200,
"Access-Control-Allow-Origin: *",
"Access-Control-Allow-Methods: *",
"Access-Control-Allow-Headers: *");
HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *",
"Access-Control-Allow-Methods: *", "Access-Control-Allow-Headers: *");
}
});
@ -85,7 +84,7 @@ public class Main {
}
private static void startWebServer(Configuration config, Router router) throws IOException {
if (config.useSsl()) {
if (config.useSsl()) { // Not needed with the use of a proxy
SSLServerSocket server = null;
try {
System.setProperty("javax.net.ssl.keyStore", config.getSslKeystore());
@ -106,8 +105,7 @@ public class Main {
server.close();
}
}
}
else {
} else {
try (ServerSocket server = new ServerSocket(config.getTcpPort())) {
while (!server.isClosed()) {
Socket socket = server.accept();
@ -115,8 +113,7 @@ public class Main {
Client client = new Client(socket, router, rsaJsonWebKey);
client.start();
}
}
catch (Exception e) {
} catch (Exception e) {
e.printStackTrace();
}
}

View file

@ -5,10 +5,6 @@ public class Badge {
private byte[] logo;
private int level;
public Badge(String name, int level) {
this(name, null, level);
}
public Badge(String name, byte[] logo, int level) {
this.name = name;
this.logo = logo;
@ -19,24 +15,11 @@ public class Badge {
return name;
}
public void setName(String name) {
this.name = name;
}
public byte[] getLogo() {
return logo;
}
public void setLogo(byte[] logo) {
this.logo = logo;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
}

View file

@ -1,7 +1,6 @@
package be.jeffcheasey88.peeratcode.model;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.List;
public class Chapter {
@ -23,18 +22,10 @@ public class Chapter {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Puzzle> getPuzzles() {
return puzzles;
}
@ -53,8 +44,10 @@ public class Chapter {
@Override
public boolean equals(Object object) {
if(this == object) return true;
if(!(object instanceof Chapter)) return false;
if (this == object)
return true;
if (!(object instanceof Chapter))
return false;
return this.id == (((Chapter) object).id);
}

View file

@ -12,10 +12,6 @@ public class Completion {
this(playerId, puzzleId, -1, 1, fileName, score, null);
}
public Completion(int playerId, int puzzleId, int idCompletion, int tries, String fileName, int score) {
this(playerId, puzzleId, idCompletion, tries, fileName, score, null);
}
public Completion(int playerId, int puzzleId, int idCompletion, int tries, String fileName, int score,
byte[] file) {
this.playerId = playerId;
@ -42,6 +38,7 @@ public class Completion {
this.tries++;
updateScore();
}
private void updateScore() {
if (tries > 1) {
score = score * (1 - ((tries - 1) / 10));

View file

@ -1,7 +1,10 @@
package be.jeffcheasey88.peeratcode.model;
import java.sql.Timestamp;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.SortedSet;
import java.util.TreeSet;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
@ -32,15 +35,11 @@ public class Group implements Comparable<Group> {
int pPosition = players.indexOf(newPlayer);
if (pPosition < 0) {
players.add(newPlayer);
}
else {
} else {
players.get(pPosition).addScore(newPlayer.getTotalScore(), newPlayer.getTotalTries());
}
}
}
public SortedSet<Player> getPlayers() {
return new TreeSet<Player>(players);
}
public int getScore() {
int score = 0;
@ -68,35 +67,27 @@ public class Group implements Comparable<Group> {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLinkToChapter() {
return linkToChapter;
}
public void setLinkToChapter(int linkToChapter) {
this.linkToChapter = linkToChapter;
}
public int getLinkToPuzzle() {
return linkToPuzzle;
}
public void setLinkToPuzzle(int linkToPuzzle) {
this.linkToPuzzle = linkToPuzzle;
}
public JSONObject toJson() {
return this.toJson(null);
}
public JSONObject toJson(Integer rank) {
JSONObject groupJSON = new JSONObject();
groupJSON.put("name", name);
if (rank != null) groupJSON.put("rank", rank);
else if (linkToChapter > 0) groupJSON.put("chapter", linkToChapter);
else if (linkToPuzzle > 0) groupJSON.put("puzzle", linkToPuzzle);
if (rank != null)
groupJSON.put("rank", rank);
else if (linkToChapter > 0)
groupJSON.put("chapter", linkToChapter);
else if (linkToPuzzle > 0)
groupJSON.put("puzzle", linkToPuzzle);
if (players != null) {
JSONArray groupsPlayerJSON = new JSONArray();
for (Player p : players) {
@ -144,5 +135,4 @@ public class Group implements Comparable<Group> {
return Objects.equals(name, other.name);
}
}

View file

@ -72,11 +72,6 @@ public class Player implements Comparable<Player> {
return groups;
}
/**
* SEE SET_TAGS IN PUZZLE
*
* @return DEATH
*/
public JSONArray getJsonGroups() {
if (groups != null) {
JSONArray groupsJSON = new JSONArray();
@ -146,11 +141,6 @@ public class Player implements Comparable<Player> {
return badges;
}
/**
* SEE SET_TAGS IN PUZZLE
*
* @return DEATH
*/
public JSONArray getJsonBadges() {
if (badges == null)
return null;

View file

@ -18,10 +18,8 @@ public class Puzzle {
private Set<String> tags;
private int depend;
public Puzzle(int id, String name, String content, byte[] soluce, String verify, int scoreMax, String tags){
this(id, name, content, soluce, verify, scoreMax, tags, -1);
}
public Puzzle(int id, String name, String content, byte[] soluce, String verify, int scoreMax, String tags, int depend){
public Puzzle(int id, String name, String content, byte[] soluce, String verify, int scoreMax, String tags,
int depend) {
this.id = id;
this.name = name;
this.content = content;
@ -36,56 +34,29 @@ public class Puzzle {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public byte[] getSoluce() {
return this.soluce;
}
public void setSoluce(byte[] array){
this.soluce = array;
}
public String getVerify(){
return this.verify;
}
public void setVerify(String regex){
this.verify = regex;
}
public int getScoreMax() {
return this.scoreMax;
}
public void setScoreMax(int max){
this.scoreMax = max;
}
public Set<String> getTags() {
return this.tags;
}
/**
* DO NOT EVER EVER SHOW TO MISTER LUDWIG XD
*
* @return DEATH
*/
public JSONArray getJsonTags() {
@ -111,14 +82,12 @@ public class Puzzle {
return this.depend;
}
public void setDepend(int depend){
this.depend = depend;
}
@Override
public boolean equals(Object object) {
if(this == object) return true;
if(!(object instanceof Puzzle)) return false;
if (this == object)
return true;
if (!(object instanceof Puzzle))
return false;
return this.id == (((Puzzle) object).id);
}

View file

@ -5,32 +5,55 @@ import java.sql.PreparedStatement;
import java.sql.SQLException;
public enum DatabaseQuery {
// PUZZLES
SPECIFIC_PUZZLE_QUERY(
"SELECT p.*, np.origin, GROUP_CONCAT(t.name) AS tags FROM puzzles p LEFT JOIN nextPart np ON p.id_puzzle = np.next LEFT JOIN containsTags ct ON ct.fk_puzzle = p.id_puzzle LEFT JOIN tags t ON t.id_tag = ct.fk_tag WHERE p.id_puzzle = ? GROUP BY p.id_puzzle"),
PUZZLES_IN_CHAPTER_QUERY(
"SELECT p.*, GROUP_CONCAT(t.name) AS tags FROM puzzles p LEFT JOIN containsTags ct ON ct.fk_puzzle = p.id_puzzle LEFT JOIN tags t ON t.id_tag = ct.fk_tag WHERE fk_chapter = ? GROUP BY p.id_puzzle"),
SPECIFIC_PUZZLE_QUERY("SELECT p.*, np.origin, GROUP_CONCAT(t.name) AS tags FROM puzzles p LEFT JOIN nextPart np ON p.id_puzzle = np.next LEFT JOIN containsTags ct ON ct.fk_puzzle = p.id_puzzle LEFT JOIN tags t ON t.id_tag = ct.fk_tag WHERE p.id_puzzle = ? GROUP BY p.id_puzzle"),
// CHAPTERS
SPECIFIC_CHAPTER_QUERY("SELECT * FROM chapters WHERE id_chapter = ?"),
PUZZLES_IN_CHAPTER_QUERY("SELECT p.*, GROUP_CONCAT(t.name) AS tags FROM puzzles p LEFT JOIN containsTags ct ON ct.fk_puzzle = p.id_puzzle LEFT JOIN tags t ON t.id_tag = ct.fk_tag WHERE fk_chapter = ? GROUP BY p.id_puzzle"),
ALL_CHAPTERS_QUERY("SELECT * FROM chapters WHERE id_chapter > 0"),
ALL_GROUPS("SELCT * FROM groups"),
ALL_PLAYERS_FOR_LEADERBOARD("select p.*, scores.*, g.* from players p ,(SELECT fk_player, SUM(c.score) AS score, COUNT(c.id_completion) AS completions, SUM(c.tries) AS tries, rank() over(ORDER BY score DESC) AS rank FROM completions c GROUP BY c.fk_player) AS scores LEFT JOIN containsGroups cg ON scores.fk_player = cg.fk_player LEFT JOIN groups g ON cg.fk_group = g.id_group WHERE p.id_player = scores.fk_player ORDER BY g.fk_chapter, g.fk_puzzle"),
ALL_GROUP_FOR_CHAPTER_LEADERBOARD("SELECT g.*, pl.pseudo, co.score, co.tries FROM groups g LEFT JOIN containsGroups cg ON g.id_group = cg.fk_group LEFT JOIN players pl ON cg.fk_player = pl.id_player LEFT JOIN completions co ON pl.id_player = co.fk_player WHERE fk_chapter = ? AND (co.fk_puzzle IN (SELECT id_puzzle FROM puzzles puz WHERE puz.fk_chapter = g.fk_chapter) OR co.score IS NULL);"),
// GROUPS
ALL_GROUPS("SELCT * FROM groups"), INSERT_GROUP("INSERT INTO groups (name, fk_chapter, fk_puzzle) VALUES (?,?,?)"),
UPDATE_COMPLETION(
"UPDATE completions SET tries = ?, filename = ?, score = ? WHERE fk_puzzle = ? AND fk_player = ?"),
// LEADERBOARD
ALL_PLAYERS_FOR_LEADERBOARD(
"select p.*, scores.*, g.* from players p ,(SELECT fk_player, SUM(c.score) AS score, COUNT(c.id_completion) AS completions, SUM(c.tries) AS tries, rank() over(ORDER BY score DESC) AS rank FROM completions c GROUP BY c.fk_player) AS scores LEFT JOIN containsGroups cg ON scores.fk_player = cg.fk_player LEFT JOIN groups g ON cg.fk_group = g.id_group WHERE p.id_player = scores.fk_player ORDER BY g.fk_chapter, g.fk_puzzle"),
ALL_GROUP_FOR_CHAPTER_LEADERBOARD(
"SELECT g.*, pl.pseudo, co.score, co.tries FROM groups g LEFT JOIN containsGroups cg ON g.id_group = cg.fk_group LEFT JOIN players pl ON cg.fk_player = pl.id_player LEFT JOIN completions co ON pl.id_player = co.fk_player WHERE fk_chapter = ? AND (co.fk_puzzle IN (SELECT id_puzzle FROM puzzles puz WHERE puz.fk_chapter = g.fk_chapter) OR co.score IS NULL);"),
// REGISTER
CHECK_PSEUDO_AVAILABLE_QUERY("SELECT * FROM players WHERE pseudo = ?"),
CHECK_EMAIL_AVAILABLE_QUERY("SELECT * FROM players WHERE email = ?"),
REGISTER_QUERY("INSERT INTO players (pseudo, email, passwd, firstname, lastname, description, avatar) VALUES (?, ?, ?, ?, ?, ?, ?)"),
REGISTER_PLAYER_IN_EXISTING_GROUP("INSERT INTO containsGroups (fk_player, fk_group) VALUES (?, (SELECT id_group FROM groups WHERE name = ?));"),
REGISTER_QUERY(
"INSERT INTO players (pseudo, email, passwd, firstname, lastname, description, avatar) VALUES (?, ?, ?, ?, ?, ?, ?)"),
REGISTER_PLAYER_IN_EXISTING_GROUP(
"INSERT INTO containsGroups (fk_player, fk_group) VALUES (?, (SELECT id_group FROM groups WHERE name = ?));"),
// LOGIN
CHECK_PASSWORD("SELECT id_player, passwd FROM players WHERE pseudo=?"),
// COMPLETIONS
GET_COMPLETION(
"SELECT id_completion, tries, fileName, score FROM completions WHERE fk_puzzle = ? AND fk_player = ?"),
INSERT_COMPLETION(
"INSERT INTO completions (fk_puzzle, fk_player, tries, code, fileName, score) values (?, ?, ?, ?, ?, ?)"),
SCORE("SELECT score FROM completions WHERE fk_player = ? AND fk_puzzle = ?"),
GET_COMPLETION("SELECT id_completion, tries, fileName, score FROM completions WHERE fk_puzzle = ? AND fk_player = ?"),
// PLAYERS
GET_PLAYER_SIMPLE("SELECT pseudo, email, firstname, lastname, description FROM players WHERE id_player = ?"),
GET_PLAYER_DETAILS("SELECT p.*, scores.score, scores.completions, scores.tries, scores.rank, g.* FROM players p, (SELECT fk_player, SUM(c.score) AS score, COUNT(c.id_completion) AS completions, SUM(c.tries) AS tries, rank() over(ORDER BY score DESC) AS rank FROM completions c GROUP BY c.fk_player) AS scores LEFT JOIN containsGroups cg ON scores.fk_player = cg.fk_player LEFT JOIN groups g ON cg.fk_group = g.id_group WHERE p.id_player = scores.fk_player AND "),
GET_PLAYER_DETAILS(
"SELECT p.*, scores.score, scores.completions, scores.tries, scores.rank, g.* FROM players p, (SELECT fk_player, SUM(c.score) AS score, COUNT(c.id_completion) AS completions, SUM(c.tries) AS tries, rank() over(ORDER BY score DESC) AS rank FROM completions c GROUP BY c.fk_player) AS scores LEFT JOIN containsGroups cg ON scores.fk_player = cg.fk_player LEFT JOIN groups g ON cg.fk_group = g.id_group WHERE p.id_player = scores.fk_player AND "),
GET_PLAYER_DETAILS_BY_ID(GET_PLAYER_DETAILS, " p.id_player = ? ORDER BY g.fk_chapter, g.fk_puzzle;"),
GET_PLAYER_DETAILS_BY_PSEUDO(GET_PLAYER_DETAILS, "p.pseudo = ? ORDER BY g.fk_chapter, g.fk_puzzle;"),
GET_BADGE("SELECT * FROM badges WHERE id_badge = ?"),
GET_BADGES_OF_PLAYER("SELECT * FROM badges b LEFT JOIN containsBadges cb ON cb.fk_badge = b.id_badge WHERE cb.fk_player = ?"),
INSERT_COMPLETION("INSERT INTO completions (fk_puzzle, fk_player, tries, code, fileName, score) values (?, ?, ?, ?, ?, ?)"),
INSERT_GROUP("INSERT INTO groups (name, fk_chapter, fk_puzzle) VALUES (?,?,?)"),
UPDATE_COMPLETION("UPDATE completions SET tries = ?, filename = ?, score = ? WHERE fk_puzzle = ? AND fk_player = ?");
// BADGES
GET_BADGE("SELECT * FROM badges WHERE id_badge = ?"), GET_BADGES_OF_PLAYER(
"SELECT * FROM badges b LEFT JOIN containsBadges cb ON cb.fk_badge = b.id_badge WHERE cb.fk_player = ?");
private String request;

View file

@ -1,5 +1,10 @@
package be.jeffcheasey88.peeratcode.routes;
import java.util.Base64;
import java.util.regex.Matcher;
import org.json.simple.JSONObject;
import be.jeffcheasey88.peeratcode.model.Badge;
import be.jeffcheasey88.peeratcode.repository.DatabaseRepository;
import be.jeffcheasey88.peeratcode.webserver.HttpReader;
@ -9,11 +14,6 @@ import be.jeffcheasey88.peeratcode.webserver.Response;
import be.jeffcheasey88.peeratcode.webserver.Route;
import be.jeffcheasey88.peeratcode.webserver.User;
import org.json.simple.JSONObject;
import java.util.Base64;
import java.util.regex.Matcher;
public class BadgeDetails implements Response {
private final DatabaseRepository databaseRepo;
@ -32,12 +32,12 @@ public class BadgeDetails implements Response {
JSONObject badgeJSON = new JSONObject();
if (badge != null) {
badgeJSON.put("name", badge.getName());
if(badge.getLogo() != null) badgeJSON.put("logo", Base64.getEncoder().encodeToString(badge.getLogo()));
if (badge.getLogo() != null)
badgeJSON.put("logo", Base64.getEncoder().encodeToString(badge.getLogo()));
badgeJSON.put("level", badge.getLevel());
}
writer.write(badgeJSON.toJSONString().replace("\\", ""));
}
else {
} else {
HttpUtil.responseHeaders(writer, 400, "Access-Control-Allow-Origin: *");
}
}

View file

@ -1,5 +1,10 @@
package be.jeffcheasey88.peeratcode.routes;
import java.util.regex.Matcher;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import be.jeffcheasey88.peeratcode.model.Chapter;
import be.jeffcheasey88.peeratcode.model.Puzzle;
import be.jeffcheasey88.peeratcode.repository.DatabaseRepository;
@ -10,11 +15,6 @@ import be.jeffcheasey88.peeratcode.webserver.Response;
import be.jeffcheasey88.peeratcode.webserver.Route;
import be.jeffcheasey88.peeratcode.webserver.User;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import java.util.regex.Matcher;
public class ChapterElement implements Response {
private final DatabaseRepository databaseRepo;
@ -32,14 +32,17 @@ public class ChapterElement implements Response {
JSONObject chapterJSON = new JSONObject();
chapterJSON.put("id", chapter.getId());
chapterJSON.put("name", chapter.getName());
if (chapter.getStartDate() != null) chapterJSON.put("startDate", chapter.getStartDate().toString());
if (chapter.getEndDate() != null) chapterJSON.put("endDate", chapter.getEndDate().toString());
if (chapter.getStartDate() != null)
chapterJSON.put("startDate", chapter.getStartDate().toString());
if (chapter.getEndDate() != null)
chapterJSON.put("endDate", chapter.getEndDate().toString());
JSONArray puzzles = new JSONArray();
for (Puzzle puzzle : chapter.getPuzzles()) {
JSONObject puzzleJSON = new JSONObject();
puzzleJSON.put("id", puzzle.getId());
puzzleJSON.put("name", puzzle.getName());
if (puzzle.getTags() != null) puzzleJSON.put("tags", puzzle.getJsonTags());
if (puzzle.getTags() != null)
puzzleJSON.put("tags", puzzle.getJsonTags());
puzzles.add(puzzleJSON);
}
chapterJSON.put("puzzles", puzzles);

View file

@ -34,8 +34,10 @@ public class ChapterList implements Response {
JSONObject chapterJSON = new JSONObject();
chapterJSON.put("id", chapter.getId());
chapterJSON.put("name", chapter.getName());
if (chapter.getStartDate() != null) chapterJSON.put("startDate", chapter.getStartDate().toString());
if (chapter.getEndDate() != null) chapterJSON.put("endDate", chapter.getEndDate().toString());
if (chapter.getStartDate() != null)
chapterJSON.put("startDate", chapter.getStartDate().toString());
if (chapter.getEndDate() != null)
chapterJSON.put("endDate", chapter.getEndDate().toString());
chaptersJSON.add(chapterJSON);
}
writer.write(chaptersJSON.toJSONString());

View file

@ -43,8 +43,10 @@ public class Leaderboard implements Response {
SortedSet<Group> allGroupsForChapter = databaseRepo.getAllGroupForChapterLeaderboard(chapterId);
JSONObject leaderboardJSON = new JSONObject();
if (chInfo.getStartDate() != null) leaderboardJSON.put("start_date", chInfo.getStartDate().toString());
if (chInfo.getEndDate() != null) leaderboardJSON.put("end_date", chInfo.getEndDate().toString());
if (chInfo.getStartDate() != null)
leaderboardJSON.put("start_date", chInfo.getStartDate().toString());
if (chInfo.getEndDate() != null)
leaderboardJSON.put("end_date", chInfo.getEndDate().toString());
JSONArray groupsJSON = new JSONArray();
if (allGroupsForChapter != null) {
int rank = 1;
@ -74,8 +76,10 @@ public class Leaderboard implements Response {
for (Player player : allPlayers) {
JSONObject playerJSON = new JSONObject();
playerJSON.put("pseudo", player.getPseudo());
if (player.getGroups() != null) playerJSON.put("groups", player.getJsonGroups());
if(player.getAvatar() != null) playerJSON.put("avatar", Base64.getEncoder().encodeToString(player.getAvatar()));
if (player.getGroups() != null)
playerJSON.put("groups", player.getJsonGroups());
if (player.getAvatar() != null)
playerJSON.put("avatar", Base64.getEncoder().encodeToString(player.getAvatar()));
playerJSON.put("rank", player.getRank());
playerJSON.put("score", player.getTotalScore());
playerJSON.put("completions", player.getTotalCompletion());

View file

@ -1,12 +1,7 @@
package be.jeffcheasey88.peeratcode.routes;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jose4j.jwk.RsaJsonWebKey;
import org.jose4j.jws.AlgorithmIdentifiers;
import org.jose4j.jws.JsonWebSignature;
import org.jose4j.jwt.JwtClaims;
import org.json.simple.JSONObject;
import be.jeffcheasey88.peeratcode.repository.DatabaseRepository;
@ -41,8 +36,7 @@ public class Login implements Response {
String password = (String) informations.get("passwd");
int id;
if ((id = databaseRepo.login(pseudo, password)) >= 0) {
HttpUtil.responseHeaders(writer, 200,
"Access-Control-Allow-Origin: *",
HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *",
"Access-Control-Expose-Headers: Authorization",
"Authorization: Bearer " + this.router.createAuthUser(id));
return;

View file

@ -39,13 +39,16 @@ public class PlayerDetails implements Response {
playerJSON.put("firstname", player.getFirstname());
playerJSON.put("lastname", player.getLastname());
playerJSON.put("description", player.getDescription());
if (player.getGroups() != null) playerJSON.put("groups", player.getJsonGroups());
if (player.getGroups() != null)
playerJSON.put("groups", player.getJsonGroups());
playerJSON.put("rank", player.getRank());
playerJSON.put("score", player.getTotalScore());
playerJSON.put("completions", player.getTotalCompletion());
playerJSON.put("tries", player.getTotalTries());
if (player.getBadges() != null) playerJSON.put("badges", player.getJsonBadges());
if(player.getAvatar() != null) playerJSON.put("avatar", Base64.getEncoder().encodeToString(player.getAvatar()));
if (player.getBadges() != null)
playerJSON.put("badges", player.getJsonBadges());
if (player.getAvatar() != null)
playerJSON.put("avatar", Base64.getEncoder().encodeToString(player.getAvatar()));
writer.write(playerJSON.toJSONString().replace("\\", ""));
} else {
HttpUtil.responseHeaders(writer, 400, "Access-Control-Allow-Origin: *");

View file

@ -1,11 +1,7 @@
package be.jeffcheasey88.peeratcode.routes;
import java.nio.charset.Charset;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jose4j.json.internal.json_simple.JSONArray;
import org.json.simple.JSONObject;
import be.jeffcheasey88.peeratcode.model.Puzzle;
@ -35,8 +31,10 @@ public class PuzzleElement implements Response {
puzzleJSON.put("id", puzzle.getId());
puzzleJSON.put("name", puzzle.getName());
puzzleJSON.put("content", puzzle.getContent());
if (puzzle.getTags() != null) puzzleJSON.put("tags", puzzle.getJsonTags());
if (puzzle.getDepend() > 0) puzzleJSON.put("depend", puzzle.getDepend());
if (puzzle.getTags() != null)
puzzleJSON.put("tags", puzzle.getJsonTags());
if (puzzle.getDepend() > 0)
puzzleJSON.put("depend", puzzle.getDepend());
writer.write(puzzleJSON.toJSONString());
}
}

View file

@ -54,7 +54,8 @@ public class PuzzleResponse implements Response {
}
private void saveSourceCode(ReceivedResponse received, Player player) throws IOException {
Path path = Paths.get(String.format("%s/%s/puz%04d-%s", usersFilesPath, player.getPseudo(), received.getPuzzleId(), received.getFileName()));
Path path = Paths.get(String.format("%s/%s/puz%04d-%s", usersFilesPath, player.getPseudo(),
received.getPuzzleId(), received.getFileName()));
Files.write(path, received.getSourceCode());
}

View file

@ -4,11 +4,9 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.json.simple.JSONObject;
import be.jeffcheasey88.peeratcode.model.Player;
import be.jeffcheasey88.peeratcode.repository.DatabaseRepository;
import be.jeffcheasey88.peeratcode.webserver.HttpReader;
import be.jeffcheasey88.peeratcode.webserver.HttpUtil;
@ -62,8 +60,7 @@ public class Register implements Response {
int id;
if ((id = databaseRepo.register(pseudo, email, password, firstname, lastname, description, group,
avatar)) >= 0) {
HttpUtil.responseHeaders(writer, 200,
"Access-Control-Allow-Origin: *",
HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *",
"Access-Control-Expose-Headers: Authorization",
"Authorization: Bearer " + this.router.createAuthUser(id));
createFolderToSaveSourceCode(pseudo);

View file

@ -1,7 +1,6 @@
package be.jeffcheasey88.peeratcode.routes;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import be.jeffcheasey88.peeratcode.repository.DatabaseRepository;
import be.jeffcheasey88.peeratcode.webserver.HttpReader;

View file

@ -3,7 +3,6 @@ package be.jeffcheasey88.peeratcode.routes.groups;
import java.util.regex.Matcher;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import be.jeffcheasey88.peeratcode.model.Group;
import be.jeffcheasey88.peeratcode.repository.DatabaseRepository;
@ -27,7 +26,8 @@ public class GroupList implements Response{
public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception {
HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *");
JSONArray result = new JSONArray();
for(Group group : this.repo.getAllGroups()) result.add(group.toJson());
for (Group group : this.repo.getAllGroups())
result.add(group.toJson());
writer.write(result.toJSONString());
}

View file

@ -5,7 +5,6 @@ import java.util.Arrays;
import org.jose4j.jwa.AlgorithmConstraints.ConstraintType;
import org.jose4j.jwk.RsaJsonWebKey;
import org.jose4j.jwk.RsaJwkGenerator;
import org.jose4j.jws.AlgorithmIdentifiers;
import org.jose4j.jwt.JwtClaims;
import org.jose4j.jwt.consumer.JwtConsumer;
@ -16,7 +15,7 @@ public class Client extends Thread{
private HttpReader reader;
private HttpWriter writer;
private Router router;
private RsaJsonWebKey key;
private RsaJsonWebKey key; // Really needed ?
public Client(Socket socket, Router router, RsaJsonWebKey key) throws Exception {
this.reader = new HttpReader(socket);
@ -41,16 +40,13 @@ public class Client extends Thread{
private User isLogin(HttpReader reader) throws Exception {
String auth = HttpUtil.readAuthorization(reader);
if(auth == null) return null;
if (auth == null)
return null;
try {
JwtConsumer jwtConsumer = new JwtConsumerBuilder()
.setRequireExpirationTime()
.setAllowedClockSkewInSeconds(30)
.setExpectedIssuer(this.router.getTokenIssuer())
JwtConsumer jwtConsumer = new JwtConsumerBuilder().setRequireExpirationTime()
.setAllowedClockSkewInSeconds(30).setExpectedIssuer(this.router.getTokenIssuer())
.setVerificationKey(this.router.getWebKey().getKey())
.setJwsAlgorithmConstraints(
ConstraintType.PERMIT, AlgorithmIdentifiers.RSA_USING_SHA256)
.build();
.setJwsAlgorithmConstraints(ConstraintType.PERMIT, AlgorithmIdentifiers.RSA_USING_SHA256).build();
JwtClaims jwtClaims = jwtConsumer.processToClaims(auth);
return new User(jwtClaims);

View file

@ -10,18 +10,21 @@ import org.json.simple.parser.JSONParser;
public class HttpUtil {
private HttpUtil(){}
private HttpUtil() {
}
public static void responseHeaders(HttpWriter writer, int code, String... headers) throws Exception {
writer.write("HTTP/1.1 " + code + " " + codeMessage(code) + "\n");
for(String header : headers) writer.write(header+"\n");
for (String header : headers)
writer.write(header + "\n");
writer.write("\n");
writer.flush();
}
public static void skipHeaders(HttpReader reader) throws Exception {
String line;
while(((line = reader.readLine()) != null) && (line.length() > 0));
while (((line = reader.readLine()) != null) && (line.length() > 0))
;
}
public static List<String> readMultiPartData(HttpReader reader) throws Exception {
@ -46,15 +49,14 @@ public class HttpUtil {
public static void switchToWebSocket(HttpReader reader, HttpWriter writer) throws Exception {
String key = readWebSocketKey(reader);
if(key == null) throw new IllegalArgumentException();
if (key == null)
throw new IllegalArgumentException();
writer.write("HTTP/1.1 101 Switching Protocols\n");
writer.write("Connection: Upgrade\n");
writer.write("Upgrade: websocket\n");
writer.write("Sec-WebSocket-Accept: "+
printBase64Binary(
MessageDigest.getInstance("SHA-1").
digest((key+"258EAFA5-E914-47DA-95CA-C5AB0DC85B11").getBytes("UTF-8")))+"\n");
writer.write("Sec-WebSocket-Accept: " + printBase64Binary(MessageDigest.getInstance("SHA-1")
.digest((key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").getBytes("UTF-8"))) + "\n");
writer.write("\n");
writer.flush();
}
@ -69,7 +71,8 @@ public class HttpUtil {
continue;
}
Matcher matcher = WEBSOCKET_KEY.matcher(line);
if(matcher.matches()) key = matcher.group(1);
if (matcher.matches())
key = matcher.group(1);
}
return key;
}
@ -99,8 +102,10 @@ public class HttpUtil {
Object parse;
try {
parse = new JSONParser().parse(line);
if(parse != null) return parse;
}catch(Exception e){}
if (parse != null)
return parse;
} catch (Exception e) {
}
}
}
return null;
@ -123,8 +128,10 @@ public class HttpUtil {
byte op = (byte) 127;
rLength = (byte) (data & op);
if(rLength==(byte)126) rMaskIndex=4;
if(rLength==(byte)127) rMaskIndex=10;
if (rLength == (byte) 126)
rMaskIndex = 4;
if (rLength == (byte) 127)
rMaskIndex = 10;
byte[] masks = new byte[4];
@ -147,7 +154,8 @@ public class HttpUtil {
return new String(message);
}else break;
} else
break;
}
return null;
}
@ -279,7 +287,6 @@ public class HttpUtil {
return " ";
}
// From javax.xml.bind.DatatypeConverter
private static String printBase64Binary(byte[] array) {
char[] arrayOfChar = new char[(array.length + 2) / 3 * 4];
@ -288,13 +295,16 @@ public class HttpUtil {
return new String(arrayOfChar);
}
private static int _printBase64Binary(byte[] paramArrayOfbyte, int paramInt1, int paramInt2, char[] paramArrayOfchar, int paramInt3) {
private static int _printBase64Binary(byte[] paramArrayOfbyte, int paramInt1, int paramInt2,
char[] paramArrayOfchar, int paramInt3) {
int i = paramInt2;
int j;
for (j = paramInt1; i >= 3; j += 3) {
paramArrayOfchar[paramInt3++] = encode(paramArrayOfbyte[j] >> 2);
paramArrayOfchar[paramInt3++] = encode((paramArrayOfbyte[j] & 0x3) << 4 | paramArrayOfbyte[j + 1] >> 4 & 0xF);
paramArrayOfchar[paramInt3++] = encode((paramArrayOfbyte[j + 1] & 0xF) << 2 | paramArrayOfbyte[j + 2] >> 6 & 0x3);
paramArrayOfchar[paramInt3++] = encode(
(paramArrayOfbyte[j] & 0x3) << 4 | paramArrayOfbyte[j + 1] >> 4 & 0xF);
paramArrayOfchar[paramInt3++] = encode(
(paramArrayOfbyte[j + 1] & 0xF) << 2 | paramArrayOfbyte[j + 2] >> 6 & 0x3);
paramArrayOfchar[paramInt3++] = encode(paramArrayOfbyte[j + 2] & 0x3F);
i -= 3;
}
@ -306,7 +316,8 @@ public class HttpUtil {
}
if (i == 2) {
paramArrayOfchar[paramInt3++] = encode(paramArrayOfbyte[j] >> 2);
paramArrayOfchar[paramInt3++] = encode((paramArrayOfbyte[j] & 0x3) << 4 | paramArrayOfbyte[j + 1] >> 4 & 0xF);
paramArrayOfchar[paramInt3++] = encode(
(paramArrayOfbyte[j] & 0x3) << 4 | paramArrayOfbyte[j + 1] >> 4 & 0xF);
paramArrayOfchar[paramInt3++] = encode((paramArrayOfbyte[j + 1] & 0xF) << 2);
paramArrayOfchar[paramInt3++] = '=';
}
@ -316,6 +327,7 @@ public class HttpUtil {
private static char encode(int paramInt) {
return encodeMap[paramInt & 0x3F];
}
private static final char[] encodeMap = initEncodeMap();
private static char[] initEncodeMap() {

View file

@ -1,7 +1,6 @@
package be.jeffcheasey88.peeratcode.webserver;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public interface Response {

View file

@ -10,7 +10,9 @@ import java.lang.annotation.Target;
public @interface Route {
String path() default "^.*$";
String type() default "GET";
boolean needLogin() default false;
}

View file

@ -41,7 +41,8 @@ public class Router{
public void register(Response response) {
try {
Method method = response.getClass().getDeclaredMethod("exec", Response.class.getDeclaredMethods()[0].getParameterTypes());
Method method = response.getClass().getDeclaredMethod("exec",
Response.class.getDeclaredMethods()[0].getParameterTypes());
Route route = method.getAnnotation(Route.class);
this.responses.put(response, route);
@ -60,13 +61,15 @@ public class Router{
if (routes.getValue().type().equals(type)) {
Matcher matcher = this.patterns.get(routes.getKey()).matcher(path);
if (matcher.matches()) {
if(user == null && routes.getValue().needLogin()) return;
if (user == null && routes.getValue().needLogin())
return;
routes.getKey().exec(matcher, user, reader, writer);
return;
}
}
}
if(noFileFound != null) noFileFound.exec(null, user, reader, writer);
if (noFileFound != null)
noFileFound.exec(null, user, reader, writer);
}
public RsaJsonWebKey getWebKey() {