diff --git a/.classpath b/.classpath index 49a3d6d..8eb78c7 100644 --- a/.classpath +++ b/.classpath @@ -12,6 +12,6 @@ - + diff --git a/PeerAtCodeFramework.jar b/PeerAtCodeFramework.jar index 5893b7e..6ea823e 100644 Binary files a/PeerAtCodeFramework.jar and b/PeerAtCodeFramework.jar differ diff --git a/src/be/jeffcheasey88/peeratcode/Main.java b/src/be/jeffcheasey88/peeratcode/Main.java index 54f522b..35abecb 100644 --- a/src/be/jeffcheasey88/peeratcode/Main.java +++ b/src/be/jeffcheasey88/peeratcode/Main.java @@ -13,6 +13,7 @@ import be.jeffcheasey88.peeratcode.framework.Router; import be.jeffcheasey88.peeratcode.framework.User; import be.jeffcheasey88.peeratcode.model.Completion; import be.jeffcheasey88.peeratcode.model.Group; +import be.jeffcheasey88.peeratcode.model.PeerAtUser; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; import be.jeffcheasey88.peeratcode.routes.BadgeDetails; import be.jeffcheasey88.peeratcode.routes.ChapterElement; @@ -38,8 +39,14 @@ public class Main{ Class.forName("com.mysql.cj.jdbc.Driver"); DatabaseRepository repo = new DatabaseRepository(config); - Router router = new Router(config.getTokenIssuer(), - config.getTokenExpiration()); + Router router = new Router() + .configureJwt( + (builder) -> builder.setExpectedIssuer(config.getTokenIssuer()), + (claims) -> { + claims.setIssuer(config.getTokenIssuer()); // who creates the token and signs it + claims.setExpirationTimeMinutesInTheFuture(config.getTokenExpiration()); + }, + (claims) -> new PeerAtUser(claims)); router.setDefault((matcher, user, reader, writer) -> { writer.response(404, "Access-Control-Allow-Origin: *"); @@ -50,11 +57,11 @@ public class Main{ router.register(new Response(){ @Route(path = "^(.*)$", type = OPTIONS) - @Override public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { writer.response(200, "Access-Control-Allow-Origin: *", "Access-Control-Allow-Methods: *", "Access-Control-Allow-Headers: *"); } + }); initRoutes(router, repo, config); @@ -66,7 +73,7 @@ public class Main{ router.listen(config.getTcpPort(), config.useSsl()); } - private static void initRoutes(Router router, DatabaseRepository repo, Configuration config){ + private static void initRoutes(Router router, DatabaseRepository repo, Configuration config){ router.register(new ChapterElement(repo)); router.register(new ChapterList(repo)); router.register(new PuzzleElement(repo)); diff --git a/src/be/jeffcheasey88/peeratcode/model/PeerAtUser.java b/src/be/jeffcheasey88/peeratcode/model/PeerAtUser.java new file mode 100644 index 0000000..4fbf09f --- /dev/null +++ b/src/be/jeffcheasey88/peeratcode/model/PeerAtUser.java @@ -0,0 +1,28 @@ +package be.jeffcheasey88.peeratcode.model; + +import org.jose4j.jwt.JwtClaims; + +public class PeerAtUser extends be.jeffcheasey88.peeratcode.framework.User{ + + private int id; + + public PeerAtUser(int id){ + this.id = id; + } + + public PeerAtUser(JwtClaims claims){ + this.id = ((Long) claims.getClaimValue("id")).intValue(); + } + + @Override + public void write(JwtClaims claims){ + claims.setClaim("id", this.id); + } + + public int getId(){ + return this.id; + } + + + +} diff --git a/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepository.java b/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepository.java index 1f6ad5c..d75c177 100644 --- a/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepository.java +++ b/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepository.java @@ -16,11 +16,11 @@ import com.password4j.Hash; import com.password4j.Password; import be.jeffcheasey88.peeratcode.Configuration; -import be.jeffcheasey88.peeratcode.framework.User; import be.jeffcheasey88.peeratcode.model.Badge; import be.jeffcheasey88.peeratcode.model.Chapter; import be.jeffcheasey88.peeratcode.model.Completion; import be.jeffcheasey88.peeratcode.model.Group; +import be.jeffcheasey88.peeratcode.model.PeerAtUser; import be.jeffcheasey88.peeratcode.model.Player; import be.jeffcheasey88.peeratcode.model.Puzzle; @@ -620,7 +620,7 @@ public class DatabaseRepository { statement.executeUpdate(); } - public boolean insertGroup(Group group, User creator) throws SQLException { + public boolean insertGroup(Group group, PeerAtUser creator) throws SQLException { Integer groupId = getGroupId(group); if (groupId == null) ensureConnection(); @@ -659,7 +659,7 @@ public class DatabaseRepository { return null; } - public boolean insertUserInGroup(Group group, User user) throws SQLException { + public boolean insertUserInGroup(Group group, PeerAtUser user) throws SQLException { Integer id = getGroupId(group); Group alreadyInGroup = getPlayerGroup(user.getId(), group.getLinkToChapter()); if (id != null && alreadyInGroup == null) { @@ -673,7 +673,7 @@ public class DatabaseRepository { return false; } - public boolean leaveGroup(Group group, User user) throws SQLException { + public boolean leaveGroup(Group group, PeerAtUser user) throws SQLException { Integer id = getGroupId(group); if (id != null) { PreparedStatement stmt = DatabaseQuery.LEAVE_GROUP.prepare(this.con); diff --git a/src/be/jeffcheasey88/peeratcode/routes/ChapterElement.java b/src/be/jeffcheasey88/peeratcode/routes/ChapterElement.java index 22a44f1..acba236 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/ChapterElement.java +++ b/src/be/jeffcheasey88/peeratcode/routes/ChapterElement.java @@ -12,6 +12,7 @@ import be.jeffcheasey88.peeratcode.framework.Response; import be.jeffcheasey88.peeratcode.framework.Route; import be.jeffcheasey88.peeratcode.framework.User; import be.jeffcheasey88.peeratcode.model.Chapter; +import be.jeffcheasey88.peeratcode.model.PeerAtUser; import be.jeffcheasey88.peeratcode.model.Puzzle; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; @@ -38,13 +39,14 @@ public class ChapterElement implements Response { if (chapter.getEndDate() != null) chapterJSON.put("endDate", chapter.getEndDate().toString()); JSONArray puzzles = new JSONArray(); + PeerAtUser peerat = (PeerAtUser)user; for (Puzzle puzzle : chapter.getPuzzles()){ JSONObject puzzleJSON = new JSONObject(); puzzleJSON.put("id", puzzle.getId()); puzzleJSON.put("name", puzzle.getName()); puzzleJSON.put("scoreMax", puzzle.getScoreMax()); if (puzzle.getTags() != null) puzzleJSON.put("tags", puzzle.getJsonTags()); - int score = this.databaseRepo.getScore(user.getId(), puzzle.getId()); + int score = this.databaseRepo.getScore(peerat.getId(), puzzle.getId()); if(score >= 0) puzzleJSON.put("score", score); puzzles.add(puzzleJSON); } diff --git a/src/be/jeffcheasey88/peeratcode/routes/Login.java b/src/be/jeffcheasey88/peeratcode/routes/Login.java index 378cf3a..3e57e58 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/Login.java +++ b/src/be/jeffcheasey88/peeratcode/routes/Login.java @@ -13,14 +13,15 @@ import be.jeffcheasey88.peeratcode.framework.Response; import be.jeffcheasey88.peeratcode.framework.Route; import be.jeffcheasey88.peeratcode.framework.Router; import be.jeffcheasey88.peeratcode.framework.User; +import be.jeffcheasey88.peeratcode.model.PeerAtUser; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; public class Login implements Response { private DatabaseRepository databaseRepo; - private Router router; + private Router router; - public Login(DatabaseRepository databaseRepo, Router router) { + public Login(DatabaseRepository databaseRepo, Router router) { this.databaseRepo = databaseRepo; this.router = router; } @@ -43,7 +44,7 @@ public class Login implements Response { if ((id = databaseRepo.login(pseudo, password)) >= 0) { writer.response(200, "Access-Control-Allow-Origin: *", "Access-Control-Expose-Headers: Authorization", - "Authorization: Bearer " + this.router.createAuthUser(id)); + "Authorization: Bearer " + this.router.createAuthUser(new PeerAtUser(id))); return; } } diff --git a/src/be/jeffcheasey88/peeratcode/routes/PlayerDetails.java b/src/be/jeffcheasey88/peeratcode/routes/PlayerDetails.java index acb0d42..e69e6ea 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/PlayerDetails.java +++ b/src/be/jeffcheasey88/peeratcode/routes/PlayerDetails.java @@ -11,6 +11,7 @@ import be.jeffcheasey88.peeratcode.framework.HttpWriter; import be.jeffcheasey88.peeratcode.framework.Response; import be.jeffcheasey88.peeratcode.framework.Route; import be.jeffcheasey88.peeratcode.framework.User; +import be.jeffcheasey88.peeratcode.model.PeerAtUser; import be.jeffcheasey88.peeratcode.model.Player; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; @@ -31,7 +32,8 @@ public class PlayerDetails implements Response { if (matcher.group(1) != null) { player = databaseRepo.getPlayerDetails(matcher.group(1)); } else { - player = databaseRepo.getPlayerDetails(user.getId()); + PeerAtUser peerat = (PeerAtUser)user; + player = databaseRepo.getPlayerDetails(peerat.getId()); } JSONObject playerJSON = new JSONObject(); if (player != null) { diff --git a/src/be/jeffcheasey88/peeratcode/routes/PuzzleElement.java b/src/be/jeffcheasey88/peeratcode/routes/PuzzleElement.java index c78f5b0..50e8746 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/PuzzleElement.java +++ b/src/be/jeffcheasey88/peeratcode/routes/PuzzleElement.java @@ -13,6 +13,7 @@ import be.jeffcheasey88.peeratcode.framework.Route; import be.jeffcheasey88.peeratcode.framework.User; import be.jeffcheasey88.peeratcode.model.Chapter; import be.jeffcheasey88.peeratcode.model.Completion; +import be.jeffcheasey88.peeratcode.model.PeerAtUser; import be.jeffcheasey88.peeratcode.model.Puzzle; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; @@ -46,13 +47,15 @@ public class PuzzleElement implements Response { // } // } + PeerAtUser peerat = (PeerAtUser)user; + JSONObject puzzleJSON = new JSONObject(); puzzleJSON.put("id", puzzle.getId()); puzzleJSON.put("name", puzzle.getName()); puzzleJSON.put("content", puzzle.getContent()); puzzleJSON.put("scoreMax", puzzle.getScoreMax()); if(puzzle.getTags() != null) puzzleJSON.put("tags", puzzle.getJsonTags()); - Completion completion = this.databaseRepo.getCompletionGroup(user.getId(), puzzle.getId()); + Completion completion = this.databaseRepo.getCompletionGroup(peerat.getId(), puzzle.getId()); if(completion != null && completion.getScore() >= 0){ puzzleJSON.put("score", completion.getScore()); puzzleJSON.put("tries", completion.getTries()); diff --git a/src/be/jeffcheasey88/peeratcode/routes/PuzzleResponse.java b/src/be/jeffcheasey88/peeratcode/routes/PuzzleResponse.java index e86a406..30ee942 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/PuzzleResponse.java +++ b/src/be/jeffcheasey88/peeratcode/routes/PuzzleResponse.java @@ -23,6 +23,7 @@ import be.jeffcheasey88.peeratcode.framework.User; import be.jeffcheasey88.peeratcode.model.Chapter; import be.jeffcheasey88.peeratcode.model.Completion; import be.jeffcheasey88.peeratcode.model.Group; +import be.jeffcheasey88.peeratcode.model.PeerAtUser; import be.jeffcheasey88.peeratcode.model.Player; import be.jeffcheasey88.peeratcode.model.Puzzle; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; @@ -52,9 +53,11 @@ public class PuzzleResponse implements Response { writer.response(400, "Access-Control-Allow-Origin: *"); return; } + PeerAtUser peerat = (PeerAtUser)user; + //saveSourceCode(received, databaseRepo.getPlayer(user.getId())); JSONObject responseJSON = new JSONObject(); - if(this.databaseRepo.getScore(user.getId(), received.getPuzzleId()) > 0){ + if(this.databaseRepo.getScore(peerat.getId(), received.getPuzzleId()) > 0){ writer.response(403, "Access-Control-Allow-Origin: *"); return; } @@ -79,7 +82,7 @@ public class PuzzleResponse implements Response { writer.response(423, "Access-Control-Allow-Origin: *"); return; } - Group group = this.databaseRepo.getPlayerGroup(user.getId(), chapter.getId()); + Group group = this.databaseRepo.getPlayerGroup(peerat.getId(), chapter.getId()); if(group == null){ writer.response(423, "Access-Control-Allow-Origin: *"); return; @@ -87,7 +90,7 @@ public class PuzzleResponse implements Response { } - Completion completion = databaseRepo.insertOrUpdatePuzzleResponse(received.getPuzzleId(), user.getId(), + Completion completion = databaseRepo.insertOrUpdatePuzzleResponse(received.getPuzzleId(), peerat.getId(), received.getFileName(), received.getSourceCode(), received.getResponse(), currentPuzzle); if(completion == null){ writer.response(400, "Access-Control-Allow-Origin: *"); diff --git a/src/be/jeffcheasey88/peeratcode/routes/Register.java b/src/be/jeffcheasey88/peeratcode/routes/Register.java index 2f3007c..62b7559 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/Register.java +++ b/src/be/jeffcheasey88/peeratcode/routes/Register.java @@ -16,15 +16,16 @@ import be.jeffcheasey88.peeratcode.framework.Response; import be.jeffcheasey88.peeratcode.framework.Route; import be.jeffcheasey88.peeratcode.framework.Router; import be.jeffcheasey88.peeratcode.framework.User; +import be.jeffcheasey88.peeratcode.model.PeerAtUser; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; public class Register implements Response { private DatabaseRepository databaseRepo; - private Router router; + private Router router; private String usersFilesPath; - public Register(DatabaseRepository databaseRepo, Router router, String initUsersFilesPath) { + public Register(DatabaseRepository databaseRepo, Router router, String initUsersFilesPath) { this.databaseRepo = databaseRepo; this.router = router; usersFilesPath = initUsersFilesPath; @@ -67,7 +68,7 @@ public class Register implements Response { avatar)) >= 0) { writer.response(200, "Access-Control-Allow-Origin: *", "Access-Control-Expose-Headers: Authorization", - "Authorization: Bearer " + this.router.createAuthUser(id)); + "Authorization: Bearer " + this.router.createAuthUser(new PeerAtUser(id))); createFolderToSaveSourceCode(pseudo); return; } diff --git a/src/be/jeffcheasey88/peeratcode/routes/Result.java b/src/be/jeffcheasey88/peeratcode/routes/Result.java index e2fa588..90ee371 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/Result.java +++ b/src/be/jeffcheasey88/peeratcode/routes/Result.java @@ -8,6 +8,7 @@ import be.jeffcheasey88.peeratcode.framework.HttpWriter; import be.jeffcheasey88.peeratcode.framework.Response; import be.jeffcheasey88.peeratcode.framework.Route; import be.jeffcheasey88.peeratcode.framework.User; +import be.jeffcheasey88.peeratcode.model.PeerAtUser; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; public class Result implements Response { @@ -24,8 +25,10 @@ public class Result implements Response { @Route(path = "^\\/result\\/(\\d+)$", needLogin = true) public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { int puzzle = Integer.parseInt(matcher.group(1)); - - int score = this.repo.getScore(user.getId(), puzzle); + + PeerAtUser peerat = (PeerAtUser)user; + + int score = this.repo.getScore(peerat.getId(), puzzle); if (score < 0) { writer.response(425, "Access-Control-Allow-Origin: *"); } else { diff --git a/src/be/jeffcheasey88/peeratcode/routes/groups/GroupCreate.java b/src/be/jeffcheasey88/peeratcode/routes/groups/GroupCreate.java index b09f5bd..c466aad 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/groups/GroupCreate.java +++ b/src/be/jeffcheasey88/peeratcode/routes/groups/GroupCreate.java @@ -14,6 +14,7 @@ import be.jeffcheasey88.peeratcode.framework.Route; import be.jeffcheasey88.peeratcode.framework.User; import be.jeffcheasey88.peeratcode.model.Chapter; import be.jeffcheasey88.peeratcode.model.Group; +import be.jeffcheasey88.peeratcode.model.PeerAtUser; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; public class GroupCreate implements Response { @@ -35,8 +36,9 @@ public class GroupCreate implements Response { @Route(path = "^\\/groupCreate$", type = POST, needLogin = true) public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception{ Group newGroup = new Group(reader.readJson()); + PeerAtUser peerat = (PeerAtUser)user; - if (this.repo.getPlayerGroup(user.getId(), newGroup.getLinkToChapter()) == null) { + if (this.repo.getPlayerGroup(peerat.getId(), newGroup.getLinkToChapter()) == null) { try { if(this.repo.getGroupId(newGroup) == null) throw new NullPointerException(); writer.response(403, "Access-Control-Allow-Origin: *"); @@ -52,7 +54,7 @@ public class GroupCreate implements Response { } } } - if (this.repo.insertGroup(newGroup, user)) { + if (this.repo.insertGroup(newGroup, peerat)) { writer.response(200, "Access-Control-Allow-Origin: *"); locker.setValue(newGroup); diff --git a/src/be/jeffcheasey88/peeratcode/routes/groups/GroupJoin.java b/src/be/jeffcheasey88/peeratcode/routes/groups/GroupJoin.java index cf0be76..2d14d6a 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/groups/GroupJoin.java +++ b/src/be/jeffcheasey88/peeratcode/routes/groups/GroupJoin.java @@ -15,6 +15,7 @@ import be.jeffcheasey88.peeratcode.framework.User; import be.jeffcheasey88.peeratcode.model.Chapter; import be.jeffcheasey88.peeratcode.model.Completion; import be.jeffcheasey88.peeratcode.model.Group; +import be.jeffcheasey88.peeratcode.model.PeerAtUser; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; public class GroupJoin implements Response{ @@ -40,8 +41,9 @@ public class GroupJoin implements Response{ @Route(path = "^\\/groupJoin$", type = POST, needLogin = true) public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception{ Group group = new Group(reader.readJson()); + PeerAtUser peerat = (PeerAtUser)user; - Group userGroup = this.repo.getPlayerGroup(user.getId(), group.getLinkToChapter()); + Group userGroup = this.repo.getPlayerGroup(peerat.getId(), group.getLinkToChapter()); if(group.equals(userGroup)){ writer.response(403, "Access-Control-Allow-Origin: *"); return; @@ -64,7 +66,7 @@ public class GroupJoin implements Response{ } } - if (this.repo.insertUserInGroup(group, user)) { + if (this.repo.insertUserInGroup(group, peerat)) { writer.response(200, "Access-Control-Allow-Origin: *"); leaderboard.setValue(new Completion(0, 0, 0, null, 0)); diff --git a/src/be/jeffcheasey88/peeratcode/routes/groups/GroupQuit.java b/src/be/jeffcheasey88/peeratcode/routes/groups/GroupQuit.java index 4513fe6..a188ab5 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/groups/GroupQuit.java +++ b/src/be/jeffcheasey88/peeratcode/routes/groups/GroupQuit.java @@ -15,6 +15,7 @@ import be.jeffcheasey88.peeratcode.framework.User; import be.jeffcheasey88.peeratcode.model.Chapter; import be.jeffcheasey88.peeratcode.model.Completion; import be.jeffcheasey88.peeratcode.model.Group; +import be.jeffcheasey88.peeratcode.model.PeerAtUser; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; public class GroupQuit implements Response{ @@ -38,8 +39,9 @@ public class GroupQuit implements Response{ @Route(path = "^\\/groupQuit$", type = POST, needLogin = true) public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception{ Group group = new Group(reader.readJson()); + PeerAtUser peerat = (PeerAtUser)user; - Group userGroup = this.repo.getPlayerGroup(user.getId(), group.getLinkToChapter()); + Group userGroup = this.repo.getPlayerGroup(peerat.getId(), group.getLinkToChapter()); if(!group.equals(userGroup)){ writer.response(403, "Access-Control-Allow-Origin: *"); return; @@ -56,7 +58,7 @@ public class GroupQuit implements Response{ } } - if (this.repo.leaveGroup(group, user)) { + if (this.repo.leaveGroup(group, peerat)) { writer.response(200, "Access-Control-Allow-Origin: *"); leaderboard.setValue(new Completion(0, 0, 0, null, 0));