Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions Checkable.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
package rqcode.concepts;



/**
* Implementations of this interface are requirements that can be checked programmatically through the check function.
*/
Expand Down
1 change: 0 additions & 1 deletion CombinedRequirements.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
package rqcode.concepts;
import java.util.List;

public abstract class CombinedRequirements extends Requirement {
Expand Down
4 changes: 0 additions & 4 deletions Main.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
package rqcode.tutorial.tutorial_new;

import rqcode.concepts.Checkable;

import java.util.Scanner;

public class Main {
Expand Down
4 changes: 0 additions & 4 deletions PasswordComplexity.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@

import rqcode.concepts.Requirement;


public class PasswordComplexity extends Requirement {

private String password;
Expand Down
68 changes: 68 additions & 0 deletions PasswordLockoutRequirement.java
Original file line number Diff line number Diff line change
@@ -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<String, UserLoginStatus> 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();
}

}
3 changes: 0 additions & 3 deletions PasswordMinimumLength.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
3 changes: 0 additions & 3 deletions PasswordPolicy.java
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
3 changes: 0 additions & 3 deletions Requirement.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@


import rqcode.concepts.Enforceable.EnforcementStatus;

/**
* The RQCODE requirement class.
*/
Expand Down