From 658b6587adaa5f175233ecfbc2b1791477bd3c67 Mon Sep 17 00:00:00 2001 From: rav Date: Sat, 8 Feb 2025 21:24:11 +0300 Subject: [PATCH] add PasswordLockoutRequirement.java and fix other files --- Checkable.java | 4 -- CombinedRequirements.java | 1 - Main.java | 4 -- PasswordComplexity.java | 4 -- PasswordLockoutRequirement.java | 68 +++++++++++++++++++++++++++++++++ PasswordMinimumLength.java | 3 -- PasswordPolicy.java | 3 -- Requirement.java | 3 -- 8 files changed, 68 insertions(+), 22 deletions(-) create mode 100644 PasswordLockoutRequirement.java diff --git a/Checkable.java b/Checkable.java index a33766a..7866503 100644 --- a/Checkable.java +++ b/Checkable.java @@ -1,7 +1,3 @@ -package rqcode.concepts; - - - /** * Implementations of this interface are requirements that can be checked programmatically through the check function. */ diff --git a/CombinedRequirements.java b/CombinedRequirements.java index 8c4b57e..c336b33 100644 --- a/CombinedRequirements.java +++ b/CombinedRequirements.java @@ -1,4 +1,3 @@ -package rqcode.concepts; import java.util.List; public abstract class CombinedRequirements extends Requirement { diff --git a/Main.java b/Main.java index 38d4d28..41c20e2 100644 --- a/Main.java +++ b/Main.java @@ -1,7 +1,3 @@ -package rqcode.tutorial.tutorial_new; - -import rqcode.concepts.Checkable; - import java.util.Scanner; public class Main { diff --git a/PasswordComplexity.java b/PasswordComplexity.java index 85af09d..e6ca8ba 100644 --- a/PasswordComplexity.java +++ b/PasswordComplexity.java @@ -1,7 +1,3 @@ - -import rqcode.concepts.Requirement; - - public class PasswordComplexity extends Requirement { private String password; diff --git a/PasswordLockoutRequirement.java b/PasswordLockoutRequirement.java new file mode 100644 index 0000000..5d0dbad --- /dev/null +++ b/PasswordLockoutRequirement.java @@ -0,0 +1,68 @@ +import java.util.HashMap; +import java.util.Map; + +public class PasswordLockoutRequirement extends Requirement { + + private final String username; + public PasswordLockoutRequirement(String username) { + this.username = username; + userStatusMap.putIfAbsent(username, new UserLoginStatus()); + } + + private static final int FAILED_ATTEMPTS_LIMIT = 5; + + private static final long LOCK_MS = 1000 * 22; // lock time + + private final Map userStatusMap = new HashMap<>(); + + + @Override + public Checkable.CheckStatus check() { + UserLoginStatus status = userStatusMap.get(username); + + if (status.isLockedCheck()) { + long currentTime = System.currentTimeMillis(); + if (currentTime - status.getLockStartTime() > LOCK_MS) { + status.resetLock(); + return Checkable.CheckStatus.PASS; + } + return Checkable.CheckStatus.FAIL; + } + + return Checkable.CheckStatus.PASS; + } + + private static class UserLoginStatus { + private long lockStartTime = 0; + private int failedAttemptsCount = 0; + + + public void incrementFailedAttempts() { + failedAttemptsCount++; + if (failedAttemptsCount >= FAILED_ATTEMPTS_LIMIT) { + lockStartTime = System.currentTimeMillis(); + } + } + public void resetFailedAttempts() { + failedAttemptsCount = 0; + lockStartTime = 0; + } + public boolean isLockedCheck() { + return lockStartTime > 0; + } + public long getLockStartTime() { + return lockStartTime; + } + public void resetLock() { + lockStartTime = 0; + } + } + + public void recordFailedAttempt() { + userStatusMap.get(username).incrementFailedAttempts(); + } + public void resetFailedAttempts() { + userStatusMap.get(username).resetFailedAttempts(); + } + +} \ No newline at end of file diff --git a/PasswordMinimumLength.java b/PasswordMinimumLength.java index e3262ca..278928f 100644 --- a/PasswordMinimumLength.java +++ b/PasswordMinimumLength.java @@ -1,6 +1,3 @@ - -import rqcode.concepts.Requirement; - public class PasswordMinimumLength extends Requirement { private static final int MIN_LENGTH = 8; private static final int MAX_LENGTH = 64; diff --git a/PasswordPolicy.java b/PasswordPolicy.java index 251ba3b..d257ee1 100644 --- a/PasswordPolicy.java +++ b/PasswordPolicy.java @@ -1,6 +1,3 @@ -package rqcode.tutorial.tutorial_new; -import rqcode.concepts.CombinedRequirements; -import rqcode.concepts.Requirement; import java.util.Arrays; import java.util.List; diff --git a/Requirement.java b/Requirement.java index 0c0f4ae..0406ce8 100644 --- a/Requirement.java +++ b/Requirement.java @@ -1,7 +1,4 @@ - -import rqcode.concepts.Enforceable.EnforcementStatus; - /** * The RQCODE requirement class. */