package utils; import dbProcs.Getter; import dbProcs.Setter; import java.sql.SQLException; import java.time.LocalDateTime; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** *
* This file is part of the Security Shepherd Project. * *

The Security Shepherd project is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software Foundation, either * version 3 of the License, or (at your option) any later version.
* *

The Security Shepherd project is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details.
* *

You should have received a copy of the GNU General Public License along with the Security * Shepherd project. If not, see . * * @author Mark Denihan */ public class CountdownHandler { private static final Logger log = LogManager.getLogger(CountdownHandler.class); private static LocalDateTime startTime; private static boolean hasStartTime = false; private static LocalDateTime lockTime; private static boolean hasLockTime = false; private static LocalDateTime endTime; private static boolean hasEndTime = false; private static boolean isLoaded = false; private static boolean validate() throws InvalidCountdownStateException { if (!isLoaded) { loadCountdowns(); } if (hasStartTime && hasLockTime) { if (startTime.isAfter(lockTime)) { throw new InvalidCountdownStateException("Start time must be before or equal to lock time"); } } if (hasStartTime && hasEndTime) { if (startTime.isAfter(endTime)) { throw new InvalidCountdownStateException("Start time must be before or equal to end time"); } } if (hasLockTime && hasEndTime) { if (lockTime.isAfter(endTime)) { throw new InvalidCountdownStateException("Lock time must be before or equal to end time"); } } return true; } public static boolean willStart() throws InvalidCountdownStateException { // Returns true if there is a start time but the CTF hasn't started yet validate(); return hasStartTime() && !isRunning(); } public static boolean willLock() throws InvalidCountdownStateException { // Returns true if CTF has started and there is a lock time that hasn't happened yet validate(); return isStarted() && hasLockTime() && isOpen(); } public static boolean willEnd() throws InvalidCountdownStateException { // Return true if CTF it is locked or started, has an end timer that hasn't happened yet validate(); return !willLock() && isRunning() && hasEndTime() && !hasEnded(); } public static boolean isOpen() throws InvalidCountdownStateException { // CTF is open if it has started, isn't locked and hasn't ended validate(); return isStarted() && !isLocked() && !hasEnded(); } public static boolean isRunning() throws InvalidCountdownStateException { // CTF is running if it has started, hasn't ended, but ignores lock state validate(); return isStarted() && !hasEnded(); } public static boolean isStarted() { if (!isLoaded) { loadCountdowns(); } if (hasStartTime) { // Start timer enabled, only return true if timer has passed return startTime.isBefore(LocalDateTime.now()); } else { // Start timer disabled, always say it's started return true; } } public static boolean isLocked() { if (!isLoaded) { loadCountdowns(); } return hasLockTime && lockTime.isBefore(LocalDateTime.now()); } public static boolean hasEnded() { if (!isLoaded) { loadCountdowns(); } return hasEndTime && endTime.isBefore(LocalDateTime.now()); } public static LocalDateTime getStartTime() { if (!isLoaded) { loadCountdowns(); } return startTime; } public static boolean hasStartTime() { if (!isLoaded) { loadCountdowns(); } return hasStartTime; } public static LocalDateTime getLockTime() { if (!isLoaded) { loadCountdowns(); } return lockTime; } public static boolean hasLockTime() { if (!isLoaded) { loadCountdowns(); } return hasLockTime; } public static LocalDateTime getEndTime() { if (!isLoaded) { loadCountdowns(); } return endTime; } public static boolean hasEndTime() { if (!isLoaded) { loadCountdowns(); } return hasEndTime; } public static void setStartTime(LocalDateTime theStartTime) { if (!isLoaded) { loadCountdowns(); } hasStartTime = true; startTime = theStartTime; saveCountdowns(); } public static void enableStartTime() { if (!isLoaded) { loadCountdowns(); } hasStartTime = true; saveCountdowns(); } public static void disableStartTime() { if (!isLoaded) { loadCountdowns(); } hasStartTime = false; saveCountdowns(); } public static void setLockTime(LocalDateTime theLockTime) { if (!isLoaded) { loadCountdowns(); } hasLockTime = true; lockTime = theLockTime; saveCountdowns(); } public static void enableLockTime() { if (!isLoaded) { loadCountdowns(); } hasLockTime = true; saveCountdowns(); } public static void disableLockTime() { if (!isLoaded) { loadCountdowns(); } hasLockTime = false; saveCountdowns(); } public static void setEndTime(LocalDateTime theEndTime) { if (!isLoaded) { loadCountdowns(); } hasEndTime = true; endTime = theEndTime; saveCountdowns(); } public static void enableEndTime() { if (!isLoaded) { loadCountdowns(); } hasEndTime = true; saveCountdowns(); } public static void disableEndTime() { if (!isLoaded) { loadCountdowns(); } hasEndTime = false; saveCountdowns(); } private static void saveCountdowns() { try { if (isLoaded) { Setter.setStartTime("", startTime); Setter.setStartTimeStatus("", hasStartTime); Setter.setLockTime("", lockTime); Setter.setLockTimeStatus("", hasLockTime); Setter.setEndTime("", endTime); Setter.setEndTimeStatus("", hasEndTime); } } catch (SQLException e) { log.fatal("Could not save countdown settings in database: " + e.toString()); throw new RuntimeException(e); } } public static void forceReload() { isLoaded = false; loadCountdowns(); } private static void loadCountdowns() { try { startTime = Getter.getStartTime(""); hasStartTime = Getter.getStartTimeStatus(""); lockTime = Getter.getLockTime(""); hasLockTime = Getter.getLockTimeStatus(""); endTime = Getter.getEndTime(""); hasEndTime = Getter.getEndTimeStatus(""); } catch (SQLException e) { log.fatal("Could not load module plan setting from database: " + e.toString()); throw new RuntimeException(e); } isLoaded = true; } }