From 9531dadd691c825cda57b004906e6c7d400dad10 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 5 Dec 2020 06:05:56 +0100 Subject: [PATCH] Massive changes but I have to go to sleep now --- .../controller/VotingController.java | 128 +++++++++--------- .../entities/AuthCode.java | 39 ++++++ .../entities/Voter.java | 4 + .../helper/RandomNumber.java | 15 ++ .../repositories/AuthCodesRepository.java | 10 ++ .../table/TableAction.java | 45 ++++-- .../static/styles/addingCandidates.css | 5 +- .../resources/static/styles/authenticate.css | 62 +++++++++ .../resources/static/styles/dashboard.css | 2 + src/main/resources/static/styles/voting.css | 2 +- .../resources/templates/addingCandidates.html | 42 +++++- .../resources/templates/authenticate.html | 56 ++++++++ src/main/resources/templates/dashboard.html | 12 +- .../templates/errors/alreadySubmitted.html | 0 src/main/resources/templates/start.html | 2 +- src/main/resources/templates/voting.html | 47 +++++-- 16 files changed, 377 insertions(+), 94 deletions(-) create mode 100644 src/main/java/com/github/cato447/AbizeitungVotingSystem/entities/AuthCode.java create mode 100644 src/main/java/com/github/cato447/AbizeitungVotingSystem/helper/RandomNumber.java create mode 100644 src/main/java/com/github/cato447/AbizeitungVotingSystem/repositories/AuthCodesRepository.java create mode 100644 src/main/resources/static/styles/authenticate.css create mode 100644 src/main/resources/templates/authenticate.html create mode 100644 src/main/resources/templates/errors/alreadySubmitted.html diff --git a/src/main/java/com/github/cato447/AbizeitungVotingSystem/controller/VotingController.java b/src/main/java/com/github/cato447/AbizeitungVotingSystem/controller/VotingController.java index 8c28b5b..afa55ec 100644 --- a/src/main/java/com/github/cato447/AbizeitungVotingSystem/controller/VotingController.java +++ b/src/main/java/com/github/cato447/AbizeitungVotingSystem/controller/VotingController.java @@ -1,13 +1,12 @@ package com.github.cato447.AbizeitungVotingSystem.controller; +import com.github.cato447.AbizeitungVotingSystem.entities.AuthCode; import com.github.cato447.AbizeitungVotingSystem.entities.Category; import com.github.cato447.AbizeitungVotingSystem.entities.PossibleCandidate; import com.github.cato447.AbizeitungVotingSystem.entities.Voter; import com.github.cato447.AbizeitungVotingSystem.helper.PossibleCandidateWrapper; -import com.github.cato447.AbizeitungVotingSystem.repositories.CandidateRepository; -import com.github.cato447.AbizeitungVotingSystem.repositories.CategoryRepository; -import com.github.cato447.AbizeitungVotingSystem.repositories.PossibleCandidateRepository; -import com.github.cato447.AbizeitungVotingSystem.repositories.VoterRepository; +import com.github.cato447.AbizeitungVotingSystem.helper.RandomNumber; +import com.github.cato447.AbizeitungVotingSystem.repositories.*; import com.github.cato447.AbizeitungVotingSystem.table.TableAction; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.SimpleMailMessage; @@ -20,24 +19,17 @@ import org.springframework.web.bind.annotation.RequestParam; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; import javax.annotation.PostConstruct; -import javax.servlet.http.HttpServletRequest; import java.util.*; @Controller public class VotingController { - private Boolean candidatesAdded = false; - + private Boolean candidatesAdded = true; private static final Logger LOGGER = LogManager.getLogger(VotingController.class); - private TableAction tableAction = new TableAction(); - List ipAddresses = new ArrayList(); - @Autowired VoterRepository voterRepository; @@ -50,6 +42,9 @@ public class VotingController { @Autowired PossibleCandidateRepository possibleCandidateRepository; + @Autowired + AuthCodesRepository authCodesRepository; + @Autowired JavaMailSender emailSender; @@ -75,14 +70,6 @@ public class VotingController { @RequestMapping("/") public String WelcomeSite() { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()) - .getRequest(); - - String currentIpAddress = request.getRemoteAddr(); - if (!this.ipAddresses.contains(currentIpAddress)) { - LOGGER.info("User IP: " + request.getRemoteAddr()); - ipAddresses.add(currentIpAddress); - } return "start.html"; } @@ -95,77 +82,90 @@ public class VotingController { emailSender.send(message); } - @RequestMapping("/vote") + @RequestMapping("/checkStatus") public String VerifyName(@RequestParam String name, Model model) { if (name.strip().toLowerCase().matches("[a-z]+\\.[a-z]+@adolfinum+\\.de$")) { try { Voter voter = voterRepository.findByEmail(name.toLowerCase().strip()); - LOGGER.warn(voter.getEmail()); if (voter.getVote_status()) { LOGGER.warn(name + " has already voted"); return "errors/alreadyVoted.html"; - } else if (voter.getCandidatesubmit_status()) { + } else if (voter.getCandidatesubmit_status() && candidatesAdded == false) { LOGGER.warn(name + " has already submitted its candidates"); return "errors/alreadysubmittedcandidates.html"; } else { - if(candidatesAdded) { - List categories = categoryRepository.findAll(); - model.addAttribute("categories", categories); - model.addAttribute("name", name); - //sendSimpleMessage(name,"test", "test"); - LOGGER.info(name + " is voting now"); - return "voting.html"; - } else { - PossibleCandidateWrapper possibleCandidates = new PossibleCandidateWrapper(); - List categories = categoryRepository.findAll(); - for (int i = 0; i < categories.size(); i++){ - possibleCandidates.addPossibleCandidate(new PossibleCandidate()); - } - model.addAttribute("categories", categories); - model.addAttribute("form", possibleCandidates); - LOGGER.info(name + " is submitting candidates"); - return "addingCandidates.html"; - } + AuthCode authCode = tableAction.generateToken(name, RandomNumber.getRandomNumberString(), authCodesRepository); + sendSimpleMessage(name,"Code zur Authentifizierung", "Dein Code lautet: " + authCode.getCode()); + model.addAttribute("name", name); + return "authenticate.html"; } } catch (Exception e) { LOGGER.error(name + " is not allowed to vote"); return "errors/notRegistered.html"; } } else { - return "errors/falseInput"; + return "errors/falseInput.html"; + } + } + + @RequestMapping("/vote") + public String voting_adding(@RequestParam String name, Model model){ + if(candidatesAdded) { + List categories = categoryRepository.findAll(); + model.addAttribute("categories", categories); + model.addAttribute("name", name); + return "voting.html"; + } else { + PossibleCandidateWrapper possibleCandidates = new PossibleCandidateWrapper(); + List categories = categoryRepository.findAll(); + for (int i = 0; i < categories.size(); i++){ + possibleCandidates.addPossibleCandidate(new PossibleCandidate()); + } + model.addAttribute("categories", categories); + model.addAttribute("form", possibleCandidates); + model.addAttribute("name", name); + return "addingCandidates.html"; } } @RequestMapping("/saveCandidates") - public String candidateSaving(@ModelAttribute PossibleCandidateWrapper possibleCandidates){ - LinkedList posCandidates = possibleCandidates.getPossibleCandidates(); - long index = 1; - for (PossibleCandidate posCandidate : posCandidates){ - if (posCandidate.getName() != "") { - if (possibleCandidateRepository.findByNameAndCategory(posCandidate.getName(), categoryRepository.findById(index).get()) != null) { - PossibleCandidate p = possibleCandidateRepository.findByNameAndCategory(posCandidate.getName(), categoryRepository.findById(index).get()); - LOGGER.warn(p.getVotes()); - p.setVotes(p.getVotes() + 1); - possibleCandidateRepository.save(p); - } else { - PossibleCandidate possibleCandidate = new PossibleCandidate(posCandidate.getName(), categoryRepository.findById(index).get()); - possibleCandidateRepository.save(possibleCandidate); + public String candidateSaving(@ModelAttribute PossibleCandidateWrapper possibleCandidates, @RequestParam String name){ + if (voterRepository.findByEmail(name).getVote_status()){ + return "errors/alreadyVoted.html"; + } else { + LinkedList posCandidates = possibleCandidates.getPossibleCandidates(); + long index = 1; + for (PossibleCandidate posCandidate : posCandidates){ + if (posCandidate.getName() != "") { + if (possibleCandidateRepository.findByNameAndCategory(posCandidate.getName(), categoryRepository.findById(index).get()) != null) { + PossibleCandidate p = possibleCandidateRepository.findByNameAndCategory(posCandidate.getName(), categoryRepository.findById(index).get()); + p.setVotes(p.getVotes() + 1); + possibleCandidateRepository.save(p); + } else { + PossibleCandidate possibleCandidate = new PossibleCandidate(posCandidate.getName(), categoryRepository.findById(index).get()); + possibleCandidateRepository.save(possibleCandidate); + } } + index++; } - index++; + //tableAction.updateCandidatesubmit_status(voterEmail, voterRepository); + return "candidateAddingSuccessful.html"; } - return "candidateAddingSuccessful.html"; } @RequestMapping("/processVote") - public String ProcessVote(@RequestParam String voteValues, @RequestParam String voterEmail) { - String[] partVoteValues = voteValues.split(","); - for (String s: partVoteValues) { - tableAction.voteFor(s, candidateRepository); + public String ProcessVote(@RequestParam String name, @RequestParam String voteValues) { + if (voterRepository.findByEmail(name).getCandidatesubmit_status()){ + return "errors/alreadySubmitted.html"; + } else { + String[] partVoteValues = voteValues.split(","); + for (String s : partVoteValues) { + tableAction.voteFor(s, candidateRepository); + } + //tableAction.updateVotingStatus(voterEmail, voterRepository); + LOGGER.info(name + " has voted!"); + return "voteSuccessful.html"; } - tableAction.updateVotingStatus(voterEmail,voterRepository); - LOGGER.info(voterEmail + " has voted!"); - return "voteSuccessful.html"; } @RequestMapping("/dashboard") diff --git a/src/main/java/com/github/cato447/AbizeitungVotingSystem/entities/AuthCode.java b/src/main/java/com/github/cato447/AbizeitungVotingSystem/entities/AuthCode.java new file mode 100644 index 0000000..be3231e --- /dev/null +++ b/src/main/java/com/github/cato447/AbizeitungVotingSystem/entities/AuthCode.java @@ -0,0 +1,39 @@ +package com.github.cato447.AbizeitungVotingSystem.entities; + +import javax.persistence.*; + +@Entity +@Table(name="auth_codes") +public class AuthCode { + public AuthCode(){ + super(); + } + + public AuthCode(String name, String code) { + this.name = name; + this.code = code; + } + + @Id + @GeneratedValue(strategy= GenerationType.IDENTITY) + private Long id; + private String name; + private String code; + private long time = System.currentTimeMillis(); + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public long getTime() { + return time; + } +} diff --git a/src/main/java/com/github/cato447/AbizeitungVotingSystem/entities/Voter.java b/src/main/java/com/github/cato447/AbizeitungVotingSystem/entities/Voter.java index e0fc045..97a2c51 100644 --- a/src/main/java/com/github/cato447/AbizeitungVotingSystem/entities/Voter.java +++ b/src/main/java/com/github/cato447/AbizeitungVotingSystem/entities/Voter.java @@ -42,4 +42,8 @@ public class Voter { public void vote(){ vote_status = true; } + + public void submitCandidates() { + candidatesubmit_status = true; + } } diff --git a/src/main/java/com/github/cato447/AbizeitungVotingSystem/helper/RandomNumber.java b/src/main/java/com/github/cato447/AbizeitungVotingSystem/helper/RandomNumber.java new file mode 100644 index 0000000..d3c2722 --- /dev/null +++ b/src/main/java/com/github/cato447/AbizeitungVotingSystem/helper/RandomNumber.java @@ -0,0 +1,15 @@ +package com.github.cato447.AbizeitungVotingSystem.helper; + +import java.util.Random; + +public class RandomNumber { + public static String getRandomNumberString() { + // It will generate 6 digit random Number. + // from 0 to 999999 + Random rnd = new Random(); + int number = rnd.nextInt(999999); + + // this will convert any number sequence into 6 character. + return String.format("%06d", number); + } +} diff --git a/src/main/java/com/github/cato447/AbizeitungVotingSystem/repositories/AuthCodesRepository.java b/src/main/java/com/github/cato447/AbizeitungVotingSystem/repositories/AuthCodesRepository.java new file mode 100644 index 0000000..18a49d2 --- /dev/null +++ b/src/main/java/com/github/cato447/AbizeitungVotingSystem/repositories/AuthCodesRepository.java @@ -0,0 +1,10 @@ +package com.github.cato447.AbizeitungVotingSystem.repositories; + +import com.github.cato447.AbizeitungVotingSystem.entities.AuthCode; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface AuthCodesRepository extends JpaRepository { + + public AuthCode findByName(String name); + +} diff --git a/src/main/java/com/github/cato447/AbizeitungVotingSystem/table/TableAction.java b/src/main/java/com/github/cato447/AbizeitungVotingSystem/table/TableAction.java index f7e80fd..ecfec8d 100644 --- a/src/main/java/com/github/cato447/AbizeitungVotingSystem/table/TableAction.java +++ b/src/main/java/com/github/cato447/AbizeitungVotingSystem/table/TableAction.java @@ -1,14 +1,9 @@ package com.github.cato447.AbizeitungVotingSystem.table; import com.github.cato447.AbizeitungVotingSystem.controller.VotingController; -import com.github.cato447.AbizeitungVotingSystem.entities.Candidate; -import com.github.cato447.AbizeitungVotingSystem.entities.Category; -import com.github.cato447.AbizeitungVotingSystem.entities.PossibleCandidate; -import com.github.cato447.AbizeitungVotingSystem.entities.Voter; -import com.github.cato447.AbizeitungVotingSystem.repositories.CandidateRepository; -import com.github.cato447.AbizeitungVotingSystem.repositories.CategoryRepository; -import com.github.cato447.AbizeitungVotingSystem.repositories.PossibleCandidateRepository; -import com.github.cato447.AbizeitungVotingSystem.repositories.VoterRepository; +import com.github.cato447.AbizeitungVotingSystem.entities.*; +import com.github.cato447.AbizeitungVotingSystem.repositories.*; +import org.aspectj.weaver.loadtime.definition.LightXMLParser; import java.io.File; import java.io.FileNotFoundException; @@ -36,6 +31,40 @@ public class TableAction { voterRepository.save(voter); } + public void updateCandidatesubmit_status(String email, VoterRepository voterRepository){ + Voter voter = voterRepository.findByEmail(email); + voter.submitCandidates(); + voterRepository.save(voter); + } + + public AuthCode generateToken(String name, String code, AuthCodesRepository authCodesRepository) { + AuthCode authCode = new AuthCode(name, code); + if (authCodesRepository.findByName(authCode.getName()) != null) { + authCodesRepository.findByName(authCode.getName()).setCode(authCode.getCode()); + return authCode; + } else { + authCodesRepository.save(authCode); + return authCode; + } + } + + public String checkToken(String name, String code, AuthCodesRepository authCodesRepository){ + AuthCode authCode = authCodesRepository.findByName(name); + if (authCode.getCode().equals(code) && !fiveMinutesPassed(authCode.getTime())){ + authCodesRepository.delete(authCode); + return "matched"; + } else if(fiveMinutesPassed(authCode.getTime())) { + authCodesRepository.delete(authCode); + return "expired"; + } else { + return "wrong"; + } + } + + private boolean fiveMinutesPassed(Long time){ + return System.currentTimeMillis() >= (time + 300*1000); + } + public void voteFor(String id, CandidateRepository candidateRepository){ long candidateID = Long.valueOf(id); Candidate candidate = candidateRepository.findById(candidateID).get(); diff --git a/src/main/resources/static/styles/addingCandidates.css b/src/main/resources/static/styles/addingCandidates.css index 2744139..10be17b 100644 --- a/src/main/resources/static/styles/addingCandidates.css +++ b/src/main/resources/static/styles/addingCandidates.css @@ -35,12 +35,11 @@ input { color: #FFF; font-size: .875rem; font-weight: normal; - text-transform: uppercase; text-align: left; transition: opacity .25s .5s; } -#submitButton { +.submitButton { margin-top: 5%; margin-bottom: 5%; border: 0; @@ -59,6 +58,6 @@ html, body { width: 100%; height: 100%; - background-image: linear-gradient(to bottom right, #111E25 0%, #111 100%) fixed; + background-image: linear-gradient(to bottom right, #111E25 0%, #111 100%); font-family: 'Lato', sans-serif; } \ No newline at end of file diff --git a/src/main/resources/static/styles/authenticate.css b/src/main/resources/static/styles/authenticate.css new file mode 100644 index 0000000..5ba3314 --- /dev/null +++ b/src/main/resources/static/styles/authenticate.css @@ -0,0 +1,62 @@ +body { + background-color: rgb(44, 49, 54); + font-family: Arial, Helvetica, sans-serif; +} + +.center-screen { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; +} + +.centered { + background: transparent; + margin: 0 auto; + padding: 20px; + width: 100%; + overflow: auto; +} + +h1 { + margin-top: 5%; + color: #FFF; + margin-bottom: 5%; +} + +h2.categoryHeader { + color: #FFF; +} + +input { + background-color: transparent; + border: transparent; + border-bottom: 2px solid red; + color: #FFF; + font-size: xx-large; + width: 1ch; +} + +.submitButton { + margin-top: 5%; + margin-bottom: 5%; + border: 0; + outline: 0; + background: #bb1515; + color: rgba(255, 255, 255, 0.85); + font-size: 2rem; + width: 500px; + letter-spacing: .0625rem; + border-radius: 12px; + box-shadow: 0 3px 5px 1px rgba(0, 0, 0, 0.25); + text-shadow: 0 -2px 0 rgba(0, 0, 0, 0.25), 0 1px 0 rgba(255, 255, 255, 0.2); +} + +html, +body { + width: 100%; + height: 100%; + background-image: linear-gradient(to bottom right, #111E25 0%, #111 100%); + font-family: 'Lato', sans-serif; +} \ No newline at end of file diff --git a/src/main/resources/static/styles/dashboard.css b/src/main/resources/static/styles/dashboard.css index 659ac2f..64b3054 100644 --- a/src/main/resources/static/styles/dashboard.css +++ b/src/main/resources/static/styles/dashboard.css @@ -2,6 +2,8 @@ td.voted { background-color: #f05048; } +td.submitted {} + td.notVoted { background-color: #76ed6b; } diff --git a/src/main/resources/static/styles/voting.css b/src/main/resources/static/styles/voting.css index f2776cf..a8870d8 100644 --- a/src/main/resources/static/styles/voting.css +++ b/src/main/resources/static/styles/voting.css @@ -39,7 +39,7 @@ button { transition: opacity .25s .5s; } -#submitButton { +.submitButton { margin-top: 5%; padding: .25em 0; border: 0; diff --git a/src/main/resources/templates/addingCandidates.html b/src/main/resources/templates/addingCandidates.html index a364299..e390e0e 100644 --- a/src/main/resources/templates/addingCandidates.html +++ b/src/main/resources/templates/addingCandidates.html @@ -5,17 +5,49 @@ Title + + +

Schlage für jede Kategorie eine/n Kandiadt/en vor:

-
-
-

- + +
+
+

+ +
- + +
diff --git a/src/main/resources/templates/authenticate.html b/src/main/resources/templates/authenticate.html new file mode 100644 index 0000000..23698a0 --- /dev/null +++ b/src/main/resources/templates/authenticate.html @@ -0,0 +1,56 @@ + + + + + + Title + + + + + + + + +

+

Gebe den enthaltenen Authentifizierungscode ein

+
+ + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/src/main/resources/templates/dashboard.html b/src/main/resources/templates/dashboard.html index 4f5ed1b..5b7f1cd 100644 --- a/src/main/resources/templates/dashboard.html +++ b/src/main/resources/templates/dashboard.html @@ -18,22 +18,28 @@ Id E-Mail - Vote status + Status +
+ + + +
+
- +
- +
diff --git a/src/main/resources/templates/errors/alreadySubmitted.html b/src/main/resources/templates/errors/alreadySubmitted.html new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/templates/start.html b/src/main/resources/templates/start.html index 7c44a62..42bf0c0 100644 --- a/src/main/resources/templates/start.html +++ b/src/main/resources/templates/start.html @@ -26,7 +26,7 @@
-
+ diff --git a/src/main/resources/templates/voting.html b/src/main/resources/templates/voting.html index 9dbb4ea..9f90626 100644 --- a/src/main/resources/templates/voting.html +++ b/src/main/resources/templates/voting.html @@ -5,14 +5,14 @@ Title + -

Wähle deine Kandidaten:

-
-

-
- +
+
+

+
+ +
- + + - - +