diff --git a/.classpath b/.classpath new file mode 100644 index 0000000000000000000000000000000000000000..a329f0e0ee024f38878f65a40a089d5ff128d557 --- /dev/null +++ b/.classpath @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry kind="src" path="programs/original"/> + <classpathentry kind="src" path="tests/Boundary"/> + <classpathentry kind="src" path="tests/Partitioning"/> + <classpathentry kind="lib" path="lib/hamcrest-core-1.3.jar"/> + <classpathentry kind="lib" path="lib/junit-4.11.jar"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..ae3c1726048cd06b9a143e0376ed46dd9b9a8d53 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/.project b/.project new file mode 100644 index 0000000000000000000000000000000000000000..b0c67ab1ebfa46df3a97aa4696d82a647011e803 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>TJX_swen90006-a1-2019</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/programs/mutant-1/swen90006/passbook/AlreadyLoggedInException.java b/programs/mutant-1/swen90006/passbook/AlreadyLoggedInException.java deleted file mode 100644 index 8bbbd85f001ac2939928e48c8abfe63d253e36bc..0000000000000000000000000000000000000000 --- a/programs/mutant-1/swen90006/passbook/AlreadyLoggedInException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class AlreadyLoggedInException extends Exception -{ - public AlreadyLoggedInException(String username) - { - super("Username already logged in: " + username); - } -} diff --git a/programs/mutant-1/swen90006/passbook/DuplicateUserException.java b/programs/mutant-1/swen90006/passbook/DuplicateUserException.java deleted file mode 100644 index 74370b1668a24f83dae080aa184f8c39bda8bc79..0000000000000000000000000000000000000000 --- a/programs/mutant-1/swen90006/passbook/DuplicateUserException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class DuplicateUserException extends Exception -{ - public DuplicateUserException(String username) - { - super("Username already exists: " + username); - } -} diff --git a/programs/mutant-1/swen90006/passbook/IncorrectPassphraseException.java b/programs/mutant-1/swen90006/passbook/IncorrectPassphraseException.java deleted file mode 100644 index cdfc80b86dd71e1fc5bfc400538208e492c8bd9e..0000000000000000000000000000000000000000 --- a/programs/mutant-1/swen90006/passbook/IncorrectPassphraseException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class IncorrectPassphraseException extends Exception -{ - public IncorrectPassphraseException(String username, String passphrase) - { - super("Incorrect passphrase: " + passphrase + " for user " + username); - } -} diff --git a/programs/mutant-1/swen90006/passbook/InvalidSessionIDException.java b/programs/mutant-1/swen90006/passbook/InvalidSessionIDException.java deleted file mode 100644 index 230cf58af6c85eb884849950e6fe1070018f09a5..0000000000000000000000000000000000000000 --- a/programs/mutant-1/swen90006/passbook/InvalidSessionIDException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class InvalidSessionIDException extends Exception -{ - public InvalidSessionIDException(Integer sessionID) - { - super("Invalid session ID: " + sessionID); - } -} diff --git a/programs/mutant-1/swen90006/passbook/NoSuchURLException.java b/programs/mutant-1/swen90006/passbook/NoSuchURLException.java deleted file mode 100644 index 7edb9168412549fa63ee16bc3a2665069e0047af..0000000000000000000000000000000000000000 --- a/programs/mutant-1/swen90006/passbook/NoSuchURLException.java +++ /dev/null @@ -1,11 +0,0 @@ -package swen90006.passbook; - -import java.net.URL; - -public class NoSuchURLException extends Exception -{ - public NoSuchURLException (String username, URL url) - { - super("User " + username + " does not have password for URL " + url.toString()); - } -} diff --git a/programs/mutant-1/swen90006/passbook/NoSuchUserException.java b/programs/mutant-1/swen90006/passbook/NoSuchUserException.java deleted file mode 100644 index ca4c5270a875723fd8d6cbae389227ea685b13d4..0000000000000000000000000000000000000000 --- a/programs/mutant-1/swen90006/passbook/NoSuchUserException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class NoSuchUserException extends Exception -{ - public NoSuchUserException (String username) - { - super("Username does not exist: " + username); - } -} diff --git a/programs/mutant-1/swen90006/passbook/Pair.java b/programs/mutant-1/swen90006/passbook/Pair.java deleted file mode 100644 index 8f70502f35d86c4e9e504be1e89a750d10f0d9cb..0000000000000000000000000000000000000000 --- a/programs/mutant-1/swen90006/passbook/Pair.java +++ /dev/null @@ -1,31 +0,0 @@ -package swen90006.passbook; - -/** - * A pair of objects. - */ -public class Pair<X, Y> -{ - private X first; - private Y second; - - public Pair(X first, Y second) - { - this.first = first; - this.second = second; - } - - public X getFirst() - { - return this.first; - } - - public Y getSecond() - { - return this.second; - } - - public boolean equals(Pair<X, Y> other) - { - return first.equals(other.first) && second.equals(other.second); - } -} diff --git a/programs/mutant-1/swen90006/passbook/PassBook.java b/programs/mutant-1/swen90006/passbook/PassBook.java deleted file mode 100644 index 94e2dfdcd19284dafa914ed1214ff926ea3318da..0000000000000000000000000000000000000000 --- a/programs/mutant-1/swen90006/passbook/PassBook.java +++ /dev/null @@ -1,262 +0,0 @@ -package swen90006.passbook; - -import java.util.Map; -import java.util.HashMap; -import java.util.Set; -import java.util.HashSet; -import java.net.URL; -import java.net.MalformedURLException; -import java.util.Random; -import java.util.Arrays; - -/** - * PassBook is a (fictional) online password manager. A password - * manager is a software application that generates, stores, and - * retrieves login details for users. - * - * A user has an account with PassBook. This account is protected by a - * master password, or passphrase. Each user can store login details - * for multiple websites, identified by their URL. A user can add a - * login details for a given website. The passphrase is used to - * encrypt all passwords, but for this implementation, we have ignored - * encryption. - * - * The PassBook passphrase must conform to the following requirements: - * Must be at least eight characters long and contain at - * least one digit (range 0-9), one letter in the range 'a'-'z', and - * one letter in the range 'A'-'Z'. - * - * Username and passwords for stored URLs have no password - * requirements. - * - * When a user logs into PassBook, they are given a session ID. This - * session ID is used to identify them for all transactions until they - * log out. - */ -public class PassBook -{ - /** The minimum length of a passphrase */ - public final static int MINIMUM_PASSPHRASE_LENGTH = 8; - - /** Valid URL protocols for the passbook */ - public final static String [] VALID_URL_PROTOCOLS = {"http", "https"}; - - //The passphrases (master passwords) for all users - private Map<String, String> passphrases; - - //The login details for all users and the URLs they have stored - private Map<String, PasswordTable> details; - - //Mapping from session IDs to usernames - private Map<Integer, String> userIDs; - - //Mapping from usernames to sessionIDs - private Map<String, Integer> sessionIDs; - - /** - * Constructs an empty passbook. - */ - public PassBook() - { - passphrases = new HashMap<String, String>(); - details = new HashMap<String, PasswordTable>(); - userIDs = new HashMap<Integer, String>(); - sessionIDs = new HashMap<String, Integer>(); - } - - /** - * Adds a new user to the passbook. - * - * @param passbookUsername the username for the user to be added - * @param passphrase the passphrase (master password) for the user - * @throws DuplicateUserException if the username is already in the passbook - * @throws WeakPassphraseException if the password does not fit the passphrase - rules (see class documentation) - * - * Assumption: passbookUsername and passphrase are non-null - */ - public void addUser(String passbookUsername, String passphrase) - throws DuplicateUserException, WeakPassphraseException - { - //Check if this user exists - if (passphrases.containsKey(passbookUsername)) { - throw new DuplicateUserException(passbookUsername); - } - //check the passphrase strength - else { - if (passphrase.length() < MINIMUM_PASSPHRASE_LENGTH) { - throw new WeakPassphraseException(passphrase); - } - - boolean containsLowerCase = false; - boolean containsUpperCase = false; - boolean containsNumber = false; - for (int i = 0; i < passphrase.length(); i++) { - - if ('a' <= passphrase.charAt(i) && passphrase.charAt(i) <= 'z') { - containsLowerCase = true; - } - else if ('A' <= passphrase.charAt(i) && passphrase.charAt(i) <= 'Z') { - containsUpperCase = true; - } - else if ('0' <= passphrase.charAt(i) && passphrase.charAt(i) <= '9') { - containsNumber = true; - } - } - - if (!containsLowerCase || !containsUpperCase || !containsNumber) { - throw new WeakPassphraseException(passphrase); - } - } - - passphrases.put(passbookUsername, passphrase); - PasswordTable pt = new PasswordTable(); - details.put(passbookUsername, pt); - } - - /** - * Checks if a user exists - * @param passbookUsername the passbookUsername - * @return true if and only if this user is in the passbook - * - * Assumption: passbookUsername is non-null - */ - public boolean isUser(String passbookUsername) - { - return passphrases.containsKey(passbookUsername); - } - - /** - * Logs a user into the passbook. - * - * @param passbookUsername the passbookUsername for the user - * @param passphrase the passphrase (master password) for the user - * @returns a session ID greater than or equal to 0 - * @throws NoSuchUserException if the user does not exist in the passbook - * @throws AlreadyLoggedInException if the user is already logged in - * @throws IncorrectPassphraseException if the passphrase is incorrect for this user - * - * Assumption: passbookUsername and passphrase are non-null - */ - public int loginUser(String passbookUsername, String passphrase) - throws NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException - { - //check that the user exists - if (!passphrases.containsKey(passbookUsername)) { - throw new NoSuchUserException(passbookUsername); - } - else if (sessionIDs.get(passbookUsername) != null) { - throw new AlreadyLoggedInException(passbookUsername); - } - else if (!passphrases.get(passbookUsername).equals(passphrase)) { - throw new IncorrectPassphraseException(passbookUsername, passphrase); - } - - //generate a random session ID that is not already taken - int sessionID = new Random().nextInt(Integer.MAX_VALUE); - while (userIDs.containsKey(sessionID)) { - sessionID = new Random().nextInt(Integer.MAX_VALUE); - } - - //add the session ID - sessionIDs.put(passbookUsername, sessionID); - userIDs.put(sessionID, passbookUsername); - - return sessionID; - } - - /** - * Logs out a user based on session ID. Has no affect if the session ID does not exist. - * - * @param sessionID the session ID to be terminated - * - * Assumption: session ID is non-null - */ - public void logoutUser(Integer sessionID) - { - sessionIDs.remove(userIDs.get(sessionID)); - userIDs.remove(sessionID); - } - - /** - * Updates the login details for a URL of a user. If the url - * username or password are null, the login details for this URL - * must be removed. - * - * @param sessionID the session ID for the logged-in user - * @param urlUsername the username for the user to be added - * @param url the URL for the username/password pair - * @param urlPassword the password to be add - * @throws InvalidSessionIDException if the session ID does not exists - * @throws MalformedURLException if the protocol is not 'http' or 'https' - * - * Assumption: url is non-null and a valid URL object - * Assumption: sessionID is non-null - */ - public void updateDetails(Integer sessionID, URL url, String urlUsername, String urlPassword) - throws InvalidSessionIDException, MalformedURLException - { - //check that the session ID exists - String passbookUsername = userIDs.get(sessionID); - if (passbookUsername == null) { - throw new InvalidSessionIDException(sessionID); - } - else if (!Arrays.asList(VALID_URL_PROTOCOLS).contains(url.getProtocol())) { - throw new MalformedURLException(passbookUsername); - } - - PasswordTable pt = details.get(passbookUsername); - if (urlUsername == null || urlPassword == null) { - pt.remove(url); - } - else { - pt.put(url, new Pair<String, String> (urlUsername, urlPassword)); - details.put(passbookUsername, pt); - } - } - - - /** - * Retrieves login details for a given URL and user. - * - * @param sessionID the session ID - * @param url the URL for the password being retrieved. - * @returns the username and password for a given url for the corresponding user - * @throws NoSuchUserException if the username does not exist in the passbook - * @throws MalformedURLException if the syntax is invalid (see class documentation) - * @throws NoSuchURLException if user does not have login for this URL - * - * Assumption: url is non-null and a valid URL object - * Assumption: sessionID is non-null - */ - public Pair<String, String> retrieveDetails(Integer sessionID, URL url) - throws InvalidSessionIDException, MalformedURLException, NoSuchURLException - { - //check that the session ID exists - String passbookUsername = userIDs.get(sessionID); - if (passbookUsername == null) { - throw new InvalidSessionIDException(sessionID); - } - else if (!Arrays.asList(VALID_URL_PROTOCOLS).contains(url.getProtocol())) { - throw new MalformedURLException(passbookUsername); - } - - PasswordTable pt = details.get(passbookUsername); - //if this returned nothing, the user has no details for any url - if (pt == null) { - throw new NoSuchURLException(passbookUsername, url); - } - - Pair<String, String> pair = pt.get(url); - - //if this returned nothing, the user does not have a login for this url - if (pair == null) { - throw new NoSuchURLException(passbookUsername, url); - } - - return pair; - } - - //A simple label to improve code readability - private class PasswordTable extends HashMap<URL, Pair<String, String>> {} -} diff --git a/programs/mutant-1/swen90006/passbook/WeakPassphraseException.java b/programs/mutant-1/swen90006/passbook/WeakPassphraseException.java deleted file mode 100644 index c4bc33b29151d824244eb0d5105db51e2c7473d1..0000000000000000000000000000000000000000 --- a/programs/mutant-1/swen90006/passbook/WeakPassphraseException.java +++ /dev/null @@ -1,14 +0,0 @@ -package swen90006.passbook; - -public class WeakPassphraseException extends Exception -{ - public WeakPassphraseException (String passphrase) - { - super("Passphrase does not comply with the PassBook rules\n" + - "\t- must contains at least " + - PassBook.MINIMUM_PASSPHRASE_LENGTH + " characters\n" + - "\t- must contain at least one numeric character\n" + - "\t- must contain at least one lower case letter\n" + - "\t- must contain at least one upper case letter\n"); - } -} diff --git a/programs/mutant-2/swen90006/passbook/AlreadyLoggedInException.java b/programs/mutant-2/swen90006/passbook/AlreadyLoggedInException.java deleted file mode 100644 index 8bbbd85f001ac2939928e48c8abfe63d253e36bc..0000000000000000000000000000000000000000 --- a/programs/mutant-2/swen90006/passbook/AlreadyLoggedInException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class AlreadyLoggedInException extends Exception -{ - public AlreadyLoggedInException(String username) - { - super("Username already logged in: " + username); - } -} diff --git a/programs/mutant-2/swen90006/passbook/DuplicateUserException.java b/programs/mutant-2/swen90006/passbook/DuplicateUserException.java deleted file mode 100644 index 74370b1668a24f83dae080aa184f8c39bda8bc79..0000000000000000000000000000000000000000 --- a/programs/mutant-2/swen90006/passbook/DuplicateUserException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class DuplicateUserException extends Exception -{ - public DuplicateUserException(String username) - { - super("Username already exists: " + username); - } -} diff --git a/programs/mutant-2/swen90006/passbook/IncorrectPassphraseException.java b/programs/mutant-2/swen90006/passbook/IncorrectPassphraseException.java deleted file mode 100644 index cdfc80b86dd71e1fc5bfc400538208e492c8bd9e..0000000000000000000000000000000000000000 --- a/programs/mutant-2/swen90006/passbook/IncorrectPassphraseException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class IncorrectPassphraseException extends Exception -{ - public IncorrectPassphraseException(String username, String passphrase) - { - super("Incorrect passphrase: " + passphrase + " for user " + username); - } -} diff --git a/programs/mutant-2/swen90006/passbook/InvalidSessionIDException.java b/programs/mutant-2/swen90006/passbook/InvalidSessionIDException.java deleted file mode 100644 index 230cf58af6c85eb884849950e6fe1070018f09a5..0000000000000000000000000000000000000000 --- a/programs/mutant-2/swen90006/passbook/InvalidSessionIDException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class InvalidSessionIDException extends Exception -{ - public InvalidSessionIDException(Integer sessionID) - { - super("Invalid session ID: " + sessionID); - } -} diff --git a/programs/mutant-2/swen90006/passbook/NoSuchURLException.java b/programs/mutant-2/swen90006/passbook/NoSuchURLException.java deleted file mode 100644 index 7edb9168412549fa63ee16bc3a2665069e0047af..0000000000000000000000000000000000000000 --- a/programs/mutant-2/swen90006/passbook/NoSuchURLException.java +++ /dev/null @@ -1,11 +0,0 @@ -package swen90006.passbook; - -import java.net.URL; - -public class NoSuchURLException extends Exception -{ - public NoSuchURLException (String username, URL url) - { - super("User " + username + " does not have password for URL " + url.toString()); - } -} diff --git a/programs/mutant-2/swen90006/passbook/NoSuchUserException.java b/programs/mutant-2/swen90006/passbook/NoSuchUserException.java deleted file mode 100644 index ca4c5270a875723fd8d6cbae389227ea685b13d4..0000000000000000000000000000000000000000 --- a/programs/mutant-2/swen90006/passbook/NoSuchUserException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class NoSuchUserException extends Exception -{ - public NoSuchUserException (String username) - { - super("Username does not exist: " + username); - } -} diff --git a/programs/mutant-2/swen90006/passbook/Pair.java b/programs/mutant-2/swen90006/passbook/Pair.java deleted file mode 100644 index 8f70502f35d86c4e9e504be1e89a750d10f0d9cb..0000000000000000000000000000000000000000 --- a/programs/mutant-2/swen90006/passbook/Pair.java +++ /dev/null @@ -1,31 +0,0 @@ -package swen90006.passbook; - -/** - * A pair of objects. - */ -public class Pair<X, Y> -{ - private X first; - private Y second; - - public Pair(X first, Y second) - { - this.first = first; - this.second = second; - } - - public X getFirst() - { - return this.first; - } - - public Y getSecond() - { - return this.second; - } - - public boolean equals(Pair<X, Y> other) - { - return first.equals(other.first) && second.equals(other.second); - } -} diff --git a/programs/mutant-2/swen90006/passbook/PassBook.java b/programs/mutant-2/swen90006/passbook/PassBook.java deleted file mode 100644 index 94e2dfdcd19284dafa914ed1214ff926ea3318da..0000000000000000000000000000000000000000 --- a/programs/mutant-2/swen90006/passbook/PassBook.java +++ /dev/null @@ -1,262 +0,0 @@ -package swen90006.passbook; - -import java.util.Map; -import java.util.HashMap; -import java.util.Set; -import java.util.HashSet; -import java.net.URL; -import java.net.MalformedURLException; -import java.util.Random; -import java.util.Arrays; - -/** - * PassBook is a (fictional) online password manager. A password - * manager is a software application that generates, stores, and - * retrieves login details for users. - * - * A user has an account with PassBook. This account is protected by a - * master password, or passphrase. Each user can store login details - * for multiple websites, identified by their URL. A user can add a - * login details for a given website. The passphrase is used to - * encrypt all passwords, but for this implementation, we have ignored - * encryption. - * - * The PassBook passphrase must conform to the following requirements: - * Must be at least eight characters long and contain at - * least one digit (range 0-9), one letter in the range 'a'-'z', and - * one letter in the range 'A'-'Z'. - * - * Username and passwords for stored URLs have no password - * requirements. - * - * When a user logs into PassBook, they are given a session ID. This - * session ID is used to identify them for all transactions until they - * log out. - */ -public class PassBook -{ - /** The minimum length of a passphrase */ - public final static int MINIMUM_PASSPHRASE_LENGTH = 8; - - /** Valid URL protocols for the passbook */ - public final static String [] VALID_URL_PROTOCOLS = {"http", "https"}; - - //The passphrases (master passwords) for all users - private Map<String, String> passphrases; - - //The login details for all users and the URLs they have stored - private Map<String, PasswordTable> details; - - //Mapping from session IDs to usernames - private Map<Integer, String> userIDs; - - //Mapping from usernames to sessionIDs - private Map<String, Integer> sessionIDs; - - /** - * Constructs an empty passbook. - */ - public PassBook() - { - passphrases = new HashMap<String, String>(); - details = new HashMap<String, PasswordTable>(); - userIDs = new HashMap<Integer, String>(); - sessionIDs = new HashMap<String, Integer>(); - } - - /** - * Adds a new user to the passbook. - * - * @param passbookUsername the username for the user to be added - * @param passphrase the passphrase (master password) for the user - * @throws DuplicateUserException if the username is already in the passbook - * @throws WeakPassphraseException if the password does not fit the passphrase - rules (see class documentation) - * - * Assumption: passbookUsername and passphrase are non-null - */ - public void addUser(String passbookUsername, String passphrase) - throws DuplicateUserException, WeakPassphraseException - { - //Check if this user exists - if (passphrases.containsKey(passbookUsername)) { - throw new DuplicateUserException(passbookUsername); - } - //check the passphrase strength - else { - if (passphrase.length() < MINIMUM_PASSPHRASE_LENGTH) { - throw new WeakPassphraseException(passphrase); - } - - boolean containsLowerCase = false; - boolean containsUpperCase = false; - boolean containsNumber = false; - for (int i = 0; i < passphrase.length(); i++) { - - if ('a' <= passphrase.charAt(i) && passphrase.charAt(i) <= 'z') { - containsLowerCase = true; - } - else if ('A' <= passphrase.charAt(i) && passphrase.charAt(i) <= 'Z') { - containsUpperCase = true; - } - else if ('0' <= passphrase.charAt(i) && passphrase.charAt(i) <= '9') { - containsNumber = true; - } - } - - if (!containsLowerCase || !containsUpperCase || !containsNumber) { - throw new WeakPassphraseException(passphrase); - } - } - - passphrases.put(passbookUsername, passphrase); - PasswordTable pt = new PasswordTable(); - details.put(passbookUsername, pt); - } - - /** - * Checks if a user exists - * @param passbookUsername the passbookUsername - * @return true if and only if this user is in the passbook - * - * Assumption: passbookUsername is non-null - */ - public boolean isUser(String passbookUsername) - { - return passphrases.containsKey(passbookUsername); - } - - /** - * Logs a user into the passbook. - * - * @param passbookUsername the passbookUsername for the user - * @param passphrase the passphrase (master password) for the user - * @returns a session ID greater than or equal to 0 - * @throws NoSuchUserException if the user does not exist in the passbook - * @throws AlreadyLoggedInException if the user is already logged in - * @throws IncorrectPassphraseException if the passphrase is incorrect for this user - * - * Assumption: passbookUsername and passphrase are non-null - */ - public int loginUser(String passbookUsername, String passphrase) - throws NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException - { - //check that the user exists - if (!passphrases.containsKey(passbookUsername)) { - throw new NoSuchUserException(passbookUsername); - } - else if (sessionIDs.get(passbookUsername) != null) { - throw new AlreadyLoggedInException(passbookUsername); - } - else if (!passphrases.get(passbookUsername).equals(passphrase)) { - throw new IncorrectPassphraseException(passbookUsername, passphrase); - } - - //generate a random session ID that is not already taken - int sessionID = new Random().nextInt(Integer.MAX_VALUE); - while (userIDs.containsKey(sessionID)) { - sessionID = new Random().nextInt(Integer.MAX_VALUE); - } - - //add the session ID - sessionIDs.put(passbookUsername, sessionID); - userIDs.put(sessionID, passbookUsername); - - return sessionID; - } - - /** - * Logs out a user based on session ID. Has no affect if the session ID does not exist. - * - * @param sessionID the session ID to be terminated - * - * Assumption: session ID is non-null - */ - public void logoutUser(Integer sessionID) - { - sessionIDs.remove(userIDs.get(sessionID)); - userIDs.remove(sessionID); - } - - /** - * Updates the login details for a URL of a user. If the url - * username or password are null, the login details for this URL - * must be removed. - * - * @param sessionID the session ID for the logged-in user - * @param urlUsername the username for the user to be added - * @param url the URL for the username/password pair - * @param urlPassword the password to be add - * @throws InvalidSessionIDException if the session ID does not exists - * @throws MalformedURLException if the protocol is not 'http' or 'https' - * - * Assumption: url is non-null and a valid URL object - * Assumption: sessionID is non-null - */ - public void updateDetails(Integer sessionID, URL url, String urlUsername, String urlPassword) - throws InvalidSessionIDException, MalformedURLException - { - //check that the session ID exists - String passbookUsername = userIDs.get(sessionID); - if (passbookUsername == null) { - throw new InvalidSessionIDException(sessionID); - } - else if (!Arrays.asList(VALID_URL_PROTOCOLS).contains(url.getProtocol())) { - throw new MalformedURLException(passbookUsername); - } - - PasswordTable pt = details.get(passbookUsername); - if (urlUsername == null || urlPassword == null) { - pt.remove(url); - } - else { - pt.put(url, new Pair<String, String> (urlUsername, urlPassword)); - details.put(passbookUsername, pt); - } - } - - - /** - * Retrieves login details for a given URL and user. - * - * @param sessionID the session ID - * @param url the URL for the password being retrieved. - * @returns the username and password for a given url for the corresponding user - * @throws NoSuchUserException if the username does not exist in the passbook - * @throws MalformedURLException if the syntax is invalid (see class documentation) - * @throws NoSuchURLException if user does not have login for this URL - * - * Assumption: url is non-null and a valid URL object - * Assumption: sessionID is non-null - */ - public Pair<String, String> retrieveDetails(Integer sessionID, URL url) - throws InvalidSessionIDException, MalformedURLException, NoSuchURLException - { - //check that the session ID exists - String passbookUsername = userIDs.get(sessionID); - if (passbookUsername == null) { - throw new InvalidSessionIDException(sessionID); - } - else if (!Arrays.asList(VALID_URL_PROTOCOLS).contains(url.getProtocol())) { - throw new MalformedURLException(passbookUsername); - } - - PasswordTable pt = details.get(passbookUsername); - //if this returned nothing, the user has no details for any url - if (pt == null) { - throw new NoSuchURLException(passbookUsername, url); - } - - Pair<String, String> pair = pt.get(url); - - //if this returned nothing, the user does not have a login for this url - if (pair == null) { - throw new NoSuchURLException(passbookUsername, url); - } - - return pair; - } - - //A simple label to improve code readability - private class PasswordTable extends HashMap<URL, Pair<String, String>> {} -} diff --git a/programs/mutant-2/swen90006/passbook/WeakPassphraseException.java b/programs/mutant-2/swen90006/passbook/WeakPassphraseException.java deleted file mode 100644 index c4bc33b29151d824244eb0d5105db51e2c7473d1..0000000000000000000000000000000000000000 --- a/programs/mutant-2/swen90006/passbook/WeakPassphraseException.java +++ /dev/null @@ -1,14 +0,0 @@ -package swen90006.passbook; - -public class WeakPassphraseException extends Exception -{ - public WeakPassphraseException (String passphrase) - { - super("Passphrase does not comply with the PassBook rules\n" + - "\t- must contains at least " + - PassBook.MINIMUM_PASSPHRASE_LENGTH + " characters\n" + - "\t- must contain at least one numeric character\n" + - "\t- must contain at least one lower case letter\n" + - "\t- must contain at least one upper case letter\n"); - } -} diff --git a/programs/mutant-3/swen90006/passbook/AlreadyLoggedInException.java b/programs/mutant-3/swen90006/passbook/AlreadyLoggedInException.java deleted file mode 100644 index 8bbbd85f001ac2939928e48c8abfe63d253e36bc..0000000000000000000000000000000000000000 --- a/programs/mutant-3/swen90006/passbook/AlreadyLoggedInException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class AlreadyLoggedInException extends Exception -{ - public AlreadyLoggedInException(String username) - { - super("Username already logged in: " + username); - } -} diff --git a/programs/mutant-3/swen90006/passbook/DuplicateUserException.java b/programs/mutant-3/swen90006/passbook/DuplicateUserException.java deleted file mode 100644 index 74370b1668a24f83dae080aa184f8c39bda8bc79..0000000000000000000000000000000000000000 --- a/programs/mutant-3/swen90006/passbook/DuplicateUserException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class DuplicateUserException extends Exception -{ - public DuplicateUserException(String username) - { - super("Username already exists: " + username); - } -} diff --git a/programs/mutant-3/swen90006/passbook/IncorrectPassphraseException.java b/programs/mutant-3/swen90006/passbook/IncorrectPassphraseException.java deleted file mode 100644 index cdfc80b86dd71e1fc5bfc400538208e492c8bd9e..0000000000000000000000000000000000000000 --- a/programs/mutant-3/swen90006/passbook/IncorrectPassphraseException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class IncorrectPassphraseException extends Exception -{ - public IncorrectPassphraseException(String username, String passphrase) - { - super("Incorrect passphrase: " + passphrase + " for user " + username); - } -} diff --git a/programs/mutant-3/swen90006/passbook/InvalidSessionIDException.java b/programs/mutant-3/swen90006/passbook/InvalidSessionIDException.java deleted file mode 100644 index 230cf58af6c85eb884849950e6fe1070018f09a5..0000000000000000000000000000000000000000 --- a/programs/mutant-3/swen90006/passbook/InvalidSessionIDException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class InvalidSessionIDException extends Exception -{ - public InvalidSessionIDException(Integer sessionID) - { - super("Invalid session ID: " + sessionID); - } -} diff --git a/programs/mutant-3/swen90006/passbook/NoSuchURLException.java b/programs/mutant-3/swen90006/passbook/NoSuchURLException.java deleted file mode 100644 index 7edb9168412549fa63ee16bc3a2665069e0047af..0000000000000000000000000000000000000000 --- a/programs/mutant-3/swen90006/passbook/NoSuchURLException.java +++ /dev/null @@ -1,11 +0,0 @@ -package swen90006.passbook; - -import java.net.URL; - -public class NoSuchURLException extends Exception -{ - public NoSuchURLException (String username, URL url) - { - super("User " + username + " does not have password for URL " + url.toString()); - } -} diff --git a/programs/mutant-3/swen90006/passbook/NoSuchUserException.java b/programs/mutant-3/swen90006/passbook/NoSuchUserException.java deleted file mode 100644 index ca4c5270a875723fd8d6cbae389227ea685b13d4..0000000000000000000000000000000000000000 --- a/programs/mutant-3/swen90006/passbook/NoSuchUserException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class NoSuchUserException extends Exception -{ - public NoSuchUserException (String username) - { - super("Username does not exist: " + username); - } -} diff --git a/programs/mutant-3/swen90006/passbook/Pair.java b/programs/mutant-3/swen90006/passbook/Pair.java deleted file mode 100644 index 8f70502f35d86c4e9e504be1e89a750d10f0d9cb..0000000000000000000000000000000000000000 --- a/programs/mutant-3/swen90006/passbook/Pair.java +++ /dev/null @@ -1,31 +0,0 @@ -package swen90006.passbook; - -/** - * A pair of objects. - */ -public class Pair<X, Y> -{ - private X first; - private Y second; - - public Pair(X first, Y second) - { - this.first = first; - this.second = second; - } - - public X getFirst() - { - return this.first; - } - - public Y getSecond() - { - return this.second; - } - - public boolean equals(Pair<X, Y> other) - { - return first.equals(other.first) && second.equals(other.second); - } -} diff --git a/programs/mutant-3/swen90006/passbook/PassBook.java b/programs/mutant-3/swen90006/passbook/PassBook.java deleted file mode 100644 index 94e2dfdcd19284dafa914ed1214ff926ea3318da..0000000000000000000000000000000000000000 --- a/programs/mutant-3/swen90006/passbook/PassBook.java +++ /dev/null @@ -1,262 +0,0 @@ -package swen90006.passbook; - -import java.util.Map; -import java.util.HashMap; -import java.util.Set; -import java.util.HashSet; -import java.net.URL; -import java.net.MalformedURLException; -import java.util.Random; -import java.util.Arrays; - -/** - * PassBook is a (fictional) online password manager. A password - * manager is a software application that generates, stores, and - * retrieves login details for users. - * - * A user has an account with PassBook. This account is protected by a - * master password, or passphrase. Each user can store login details - * for multiple websites, identified by their URL. A user can add a - * login details for a given website. The passphrase is used to - * encrypt all passwords, but for this implementation, we have ignored - * encryption. - * - * The PassBook passphrase must conform to the following requirements: - * Must be at least eight characters long and contain at - * least one digit (range 0-9), one letter in the range 'a'-'z', and - * one letter in the range 'A'-'Z'. - * - * Username and passwords for stored URLs have no password - * requirements. - * - * When a user logs into PassBook, they are given a session ID. This - * session ID is used to identify them for all transactions until they - * log out. - */ -public class PassBook -{ - /** The minimum length of a passphrase */ - public final static int MINIMUM_PASSPHRASE_LENGTH = 8; - - /** Valid URL protocols for the passbook */ - public final static String [] VALID_URL_PROTOCOLS = {"http", "https"}; - - //The passphrases (master passwords) for all users - private Map<String, String> passphrases; - - //The login details for all users and the URLs they have stored - private Map<String, PasswordTable> details; - - //Mapping from session IDs to usernames - private Map<Integer, String> userIDs; - - //Mapping from usernames to sessionIDs - private Map<String, Integer> sessionIDs; - - /** - * Constructs an empty passbook. - */ - public PassBook() - { - passphrases = new HashMap<String, String>(); - details = new HashMap<String, PasswordTable>(); - userIDs = new HashMap<Integer, String>(); - sessionIDs = new HashMap<String, Integer>(); - } - - /** - * Adds a new user to the passbook. - * - * @param passbookUsername the username for the user to be added - * @param passphrase the passphrase (master password) for the user - * @throws DuplicateUserException if the username is already in the passbook - * @throws WeakPassphraseException if the password does not fit the passphrase - rules (see class documentation) - * - * Assumption: passbookUsername and passphrase are non-null - */ - public void addUser(String passbookUsername, String passphrase) - throws DuplicateUserException, WeakPassphraseException - { - //Check if this user exists - if (passphrases.containsKey(passbookUsername)) { - throw new DuplicateUserException(passbookUsername); - } - //check the passphrase strength - else { - if (passphrase.length() < MINIMUM_PASSPHRASE_LENGTH) { - throw new WeakPassphraseException(passphrase); - } - - boolean containsLowerCase = false; - boolean containsUpperCase = false; - boolean containsNumber = false; - for (int i = 0; i < passphrase.length(); i++) { - - if ('a' <= passphrase.charAt(i) && passphrase.charAt(i) <= 'z') { - containsLowerCase = true; - } - else if ('A' <= passphrase.charAt(i) && passphrase.charAt(i) <= 'Z') { - containsUpperCase = true; - } - else if ('0' <= passphrase.charAt(i) && passphrase.charAt(i) <= '9') { - containsNumber = true; - } - } - - if (!containsLowerCase || !containsUpperCase || !containsNumber) { - throw new WeakPassphraseException(passphrase); - } - } - - passphrases.put(passbookUsername, passphrase); - PasswordTable pt = new PasswordTable(); - details.put(passbookUsername, pt); - } - - /** - * Checks if a user exists - * @param passbookUsername the passbookUsername - * @return true if and only if this user is in the passbook - * - * Assumption: passbookUsername is non-null - */ - public boolean isUser(String passbookUsername) - { - return passphrases.containsKey(passbookUsername); - } - - /** - * Logs a user into the passbook. - * - * @param passbookUsername the passbookUsername for the user - * @param passphrase the passphrase (master password) for the user - * @returns a session ID greater than or equal to 0 - * @throws NoSuchUserException if the user does not exist in the passbook - * @throws AlreadyLoggedInException if the user is already logged in - * @throws IncorrectPassphraseException if the passphrase is incorrect for this user - * - * Assumption: passbookUsername and passphrase are non-null - */ - public int loginUser(String passbookUsername, String passphrase) - throws NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException - { - //check that the user exists - if (!passphrases.containsKey(passbookUsername)) { - throw new NoSuchUserException(passbookUsername); - } - else if (sessionIDs.get(passbookUsername) != null) { - throw new AlreadyLoggedInException(passbookUsername); - } - else if (!passphrases.get(passbookUsername).equals(passphrase)) { - throw new IncorrectPassphraseException(passbookUsername, passphrase); - } - - //generate a random session ID that is not already taken - int sessionID = new Random().nextInt(Integer.MAX_VALUE); - while (userIDs.containsKey(sessionID)) { - sessionID = new Random().nextInt(Integer.MAX_VALUE); - } - - //add the session ID - sessionIDs.put(passbookUsername, sessionID); - userIDs.put(sessionID, passbookUsername); - - return sessionID; - } - - /** - * Logs out a user based on session ID. Has no affect if the session ID does not exist. - * - * @param sessionID the session ID to be terminated - * - * Assumption: session ID is non-null - */ - public void logoutUser(Integer sessionID) - { - sessionIDs.remove(userIDs.get(sessionID)); - userIDs.remove(sessionID); - } - - /** - * Updates the login details for a URL of a user. If the url - * username or password are null, the login details for this URL - * must be removed. - * - * @param sessionID the session ID for the logged-in user - * @param urlUsername the username for the user to be added - * @param url the URL for the username/password pair - * @param urlPassword the password to be add - * @throws InvalidSessionIDException if the session ID does not exists - * @throws MalformedURLException if the protocol is not 'http' or 'https' - * - * Assumption: url is non-null and a valid URL object - * Assumption: sessionID is non-null - */ - public void updateDetails(Integer sessionID, URL url, String urlUsername, String urlPassword) - throws InvalidSessionIDException, MalformedURLException - { - //check that the session ID exists - String passbookUsername = userIDs.get(sessionID); - if (passbookUsername == null) { - throw new InvalidSessionIDException(sessionID); - } - else if (!Arrays.asList(VALID_URL_PROTOCOLS).contains(url.getProtocol())) { - throw new MalformedURLException(passbookUsername); - } - - PasswordTable pt = details.get(passbookUsername); - if (urlUsername == null || urlPassword == null) { - pt.remove(url); - } - else { - pt.put(url, new Pair<String, String> (urlUsername, urlPassword)); - details.put(passbookUsername, pt); - } - } - - - /** - * Retrieves login details for a given URL and user. - * - * @param sessionID the session ID - * @param url the URL for the password being retrieved. - * @returns the username and password for a given url for the corresponding user - * @throws NoSuchUserException if the username does not exist in the passbook - * @throws MalformedURLException if the syntax is invalid (see class documentation) - * @throws NoSuchURLException if user does not have login for this URL - * - * Assumption: url is non-null and a valid URL object - * Assumption: sessionID is non-null - */ - public Pair<String, String> retrieveDetails(Integer sessionID, URL url) - throws InvalidSessionIDException, MalformedURLException, NoSuchURLException - { - //check that the session ID exists - String passbookUsername = userIDs.get(sessionID); - if (passbookUsername == null) { - throw new InvalidSessionIDException(sessionID); - } - else if (!Arrays.asList(VALID_URL_PROTOCOLS).contains(url.getProtocol())) { - throw new MalformedURLException(passbookUsername); - } - - PasswordTable pt = details.get(passbookUsername); - //if this returned nothing, the user has no details for any url - if (pt == null) { - throw new NoSuchURLException(passbookUsername, url); - } - - Pair<String, String> pair = pt.get(url); - - //if this returned nothing, the user does not have a login for this url - if (pair == null) { - throw new NoSuchURLException(passbookUsername, url); - } - - return pair; - } - - //A simple label to improve code readability - private class PasswordTable extends HashMap<URL, Pair<String, String>> {} -} diff --git a/programs/mutant-3/swen90006/passbook/WeakPassphraseException.java b/programs/mutant-3/swen90006/passbook/WeakPassphraseException.java deleted file mode 100644 index c4bc33b29151d824244eb0d5105db51e2c7473d1..0000000000000000000000000000000000000000 --- a/programs/mutant-3/swen90006/passbook/WeakPassphraseException.java +++ /dev/null @@ -1,14 +0,0 @@ -package swen90006.passbook; - -public class WeakPassphraseException extends Exception -{ - public WeakPassphraseException (String passphrase) - { - super("Passphrase does not comply with the PassBook rules\n" + - "\t- must contains at least " + - PassBook.MINIMUM_PASSPHRASE_LENGTH + " characters\n" + - "\t- must contain at least one numeric character\n" + - "\t- must contain at least one lower case letter\n" + - "\t- must contain at least one upper case letter\n"); - } -} diff --git a/programs/mutant-4/swen90006/passbook/AlreadyLoggedInException.java b/programs/mutant-4/swen90006/passbook/AlreadyLoggedInException.java deleted file mode 100644 index 8bbbd85f001ac2939928e48c8abfe63d253e36bc..0000000000000000000000000000000000000000 --- a/programs/mutant-4/swen90006/passbook/AlreadyLoggedInException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class AlreadyLoggedInException extends Exception -{ - public AlreadyLoggedInException(String username) - { - super("Username already logged in: " + username); - } -} diff --git a/programs/mutant-4/swen90006/passbook/DuplicateUserException.java b/programs/mutant-4/swen90006/passbook/DuplicateUserException.java deleted file mode 100644 index 74370b1668a24f83dae080aa184f8c39bda8bc79..0000000000000000000000000000000000000000 --- a/programs/mutant-4/swen90006/passbook/DuplicateUserException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class DuplicateUserException extends Exception -{ - public DuplicateUserException(String username) - { - super("Username already exists: " + username); - } -} diff --git a/programs/mutant-4/swen90006/passbook/IncorrectPassphraseException.java b/programs/mutant-4/swen90006/passbook/IncorrectPassphraseException.java deleted file mode 100644 index cdfc80b86dd71e1fc5bfc400538208e492c8bd9e..0000000000000000000000000000000000000000 --- a/programs/mutant-4/swen90006/passbook/IncorrectPassphraseException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class IncorrectPassphraseException extends Exception -{ - public IncorrectPassphraseException(String username, String passphrase) - { - super("Incorrect passphrase: " + passphrase + " for user " + username); - } -} diff --git a/programs/mutant-4/swen90006/passbook/InvalidSessionIDException.java b/programs/mutant-4/swen90006/passbook/InvalidSessionIDException.java deleted file mode 100644 index 230cf58af6c85eb884849950e6fe1070018f09a5..0000000000000000000000000000000000000000 --- a/programs/mutant-4/swen90006/passbook/InvalidSessionIDException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class InvalidSessionIDException extends Exception -{ - public InvalidSessionIDException(Integer sessionID) - { - super("Invalid session ID: " + sessionID); - } -} diff --git a/programs/mutant-4/swen90006/passbook/NoSuchURLException.java b/programs/mutant-4/swen90006/passbook/NoSuchURLException.java deleted file mode 100644 index 7edb9168412549fa63ee16bc3a2665069e0047af..0000000000000000000000000000000000000000 --- a/programs/mutant-4/swen90006/passbook/NoSuchURLException.java +++ /dev/null @@ -1,11 +0,0 @@ -package swen90006.passbook; - -import java.net.URL; - -public class NoSuchURLException extends Exception -{ - public NoSuchURLException (String username, URL url) - { - super("User " + username + " does not have password for URL " + url.toString()); - } -} diff --git a/programs/mutant-4/swen90006/passbook/NoSuchUserException.java b/programs/mutant-4/swen90006/passbook/NoSuchUserException.java deleted file mode 100644 index ca4c5270a875723fd8d6cbae389227ea685b13d4..0000000000000000000000000000000000000000 --- a/programs/mutant-4/swen90006/passbook/NoSuchUserException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class NoSuchUserException extends Exception -{ - public NoSuchUserException (String username) - { - super("Username does not exist: " + username); - } -} diff --git a/programs/mutant-4/swen90006/passbook/Pair.java b/programs/mutant-4/swen90006/passbook/Pair.java deleted file mode 100644 index 8f70502f35d86c4e9e504be1e89a750d10f0d9cb..0000000000000000000000000000000000000000 --- a/programs/mutant-4/swen90006/passbook/Pair.java +++ /dev/null @@ -1,31 +0,0 @@ -package swen90006.passbook; - -/** - * A pair of objects. - */ -public class Pair<X, Y> -{ - private X first; - private Y second; - - public Pair(X first, Y second) - { - this.first = first; - this.second = second; - } - - public X getFirst() - { - return this.first; - } - - public Y getSecond() - { - return this.second; - } - - public boolean equals(Pair<X, Y> other) - { - return first.equals(other.first) && second.equals(other.second); - } -} diff --git a/programs/mutant-4/swen90006/passbook/PassBook.java b/programs/mutant-4/swen90006/passbook/PassBook.java deleted file mode 100644 index 94e2dfdcd19284dafa914ed1214ff926ea3318da..0000000000000000000000000000000000000000 --- a/programs/mutant-4/swen90006/passbook/PassBook.java +++ /dev/null @@ -1,262 +0,0 @@ -package swen90006.passbook; - -import java.util.Map; -import java.util.HashMap; -import java.util.Set; -import java.util.HashSet; -import java.net.URL; -import java.net.MalformedURLException; -import java.util.Random; -import java.util.Arrays; - -/** - * PassBook is a (fictional) online password manager. A password - * manager is a software application that generates, stores, and - * retrieves login details for users. - * - * A user has an account with PassBook. This account is protected by a - * master password, or passphrase. Each user can store login details - * for multiple websites, identified by their URL. A user can add a - * login details for a given website. The passphrase is used to - * encrypt all passwords, but for this implementation, we have ignored - * encryption. - * - * The PassBook passphrase must conform to the following requirements: - * Must be at least eight characters long and contain at - * least one digit (range 0-9), one letter in the range 'a'-'z', and - * one letter in the range 'A'-'Z'. - * - * Username and passwords for stored URLs have no password - * requirements. - * - * When a user logs into PassBook, they are given a session ID. This - * session ID is used to identify them for all transactions until they - * log out. - */ -public class PassBook -{ - /** The minimum length of a passphrase */ - public final static int MINIMUM_PASSPHRASE_LENGTH = 8; - - /** Valid URL protocols for the passbook */ - public final static String [] VALID_URL_PROTOCOLS = {"http", "https"}; - - //The passphrases (master passwords) for all users - private Map<String, String> passphrases; - - //The login details for all users and the URLs they have stored - private Map<String, PasswordTable> details; - - //Mapping from session IDs to usernames - private Map<Integer, String> userIDs; - - //Mapping from usernames to sessionIDs - private Map<String, Integer> sessionIDs; - - /** - * Constructs an empty passbook. - */ - public PassBook() - { - passphrases = new HashMap<String, String>(); - details = new HashMap<String, PasswordTable>(); - userIDs = new HashMap<Integer, String>(); - sessionIDs = new HashMap<String, Integer>(); - } - - /** - * Adds a new user to the passbook. - * - * @param passbookUsername the username for the user to be added - * @param passphrase the passphrase (master password) for the user - * @throws DuplicateUserException if the username is already in the passbook - * @throws WeakPassphraseException if the password does not fit the passphrase - rules (see class documentation) - * - * Assumption: passbookUsername and passphrase are non-null - */ - public void addUser(String passbookUsername, String passphrase) - throws DuplicateUserException, WeakPassphraseException - { - //Check if this user exists - if (passphrases.containsKey(passbookUsername)) { - throw new DuplicateUserException(passbookUsername); - } - //check the passphrase strength - else { - if (passphrase.length() < MINIMUM_PASSPHRASE_LENGTH) { - throw new WeakPassphraseException(passphrase); - } - - boolean containsLowerCase = false; - boolean containsUpperCase = false; - boolean containsNumber = false; - for (int i = 0; i < passphrase.length(); i++) { - - if ('a' <= passphrase.charAt(i) && passphrase.charAt(i) <= 'z') { - containsLowerCase = true; - } - else if ('A' <= passphrase.charAt(i) && passphrase.charAt(i) <= 'Z') { - containsUpperCase = true; - } - else if ('0' <= passphrase.charAt(i) && passphrase.charAt(i) <= '9') { - containsNumber = true; - } - } - - if (!containsLowerCase || !containsUpperCase || !containsNumber) { - throw new WeakPassphraseException(passphrase); - } - } - - passphrases.put(passbookUsername, passphrase); - PasswordTable pt = new PasswordTable(); - details.put(passbookUsername, pt); - } - - /** - * Checks if a user exists - * @param passbookUsername the passbookUsername - * @return true if and only if this user is in the passbook - * - * Assumption: passbookUsername is non-null - */ - public boolean isUser(String passbookUsername) - { - return passphrases.containsKey(passbookUsername); - } - - /** - * Logs a user into the passbook. - * - * @param passbookUsername the passbookUsername for the user - * @param passphrase the passphrase (master password) for the user - * @returns a session ID greater than or equal to 0 - * @throws NoSuchUserException if the user does not exist in the passbook - * @throws AlreadyLoggedInException if the user is already logged in - * @throws IncorrectPassphraseException if the passphrase is incorrect for this user - * - * Assumption: passbookUsername and passphrase are non-null - */ - public int loginUser(String passbookUsername, String passphrase) - throws NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException - { - //check that the user exists - if (!passphrases.containsKey(passbookUsername)) { - throw new NoSuchUserException(passbookUsername); - } - else if (sessionIDs.get(passbookUsername) != null) { - throw new AlreadyLoggedInException(passbookUsername); - } - else if (!passphrases.get(passbookUsername).equals(passphrase)) { - throw new IncorrectPassphraseException(passbookUsername, passphrase); - } - - //generate a random session ID that is not already taken - int sessionID = new Random().nextInt(Integer.MAX_VALUE); - while (userIDs.containsKey(sessionID)) { - sessionID = new Random().nextInt(Integer.MAX_VALUE); - } - - //add the session ID - sessionIDs.put(passbookUsername, sessionID); - userIDs.put(sessionID, passbookUsername); - - return sessionID; - } - - /** - * Logs out a user based on session ID. Has no affect if the session ID does not exist. - * - * @param sessionID the session ID to be terminated - * - * Assumption: session ID is non-null - */ - public void logoutUser(Integer sessionID) - { - sessionIDs.remove(userIDs.get(sessionID)); - userIDs.remove(sessionID); - } - - /** - * Updates the login details for a URL of a user. If the url - * username or password are null, the login details for this URL - * must be removed. - * - * @param sessionID the session ID for the logged-in user - * @param urlUsername the username for the user to be added - * @param url the URL for the username/password pair - * @param urlPassword the password to be add - * @throws InvalidSessionIDException if the session ID does not exists - * @throws MalformedURLException if the protocol is not 'http' or 'https' - * - * Assumption: url is non-null and a valid URL object - * Assumption: sessionID is non-null - */ - public void updateDetails(Integer sessionID, URL url, String urlUsername, String urlPassword) - throws InvalidSessionIDException, MalformedURLException - { - //check that the session ID exists - String passbookUsername = userIDs.get(sessionID); - if (passbookUsername == null) { - throw new InvalidSessionIDException(sessionID); - } - else if (!Arrays.asList(VALID_URL_PROTOCOLS).contains(url.getProtocol())) { - throw new MalformedURLException(passbookUsername); - } - - PasswordTable pt = details.get(passbookUsername); - if (urlUsername == null || urlPassword == null) { - pt.remove(url); - } - else { - pt.put(url, new Pair<String, String> (urlUsername, urlPassword)); - details.put(passbookUsername, pt); - } - } - - - /** - * Retrieves login details for a given URL and user. - * - * @param sessionID the session ID - * @param url the URL for the password being retrieved. - * @returns the username and password for a given url for the corresponding user - * @throws NoSuchUserException if the username does not exist in the passbook - * @throws MalformedURLException if the syntax is invalid (see class documentation) - * @throws NoSuchURLException if user does not have login for this URL - * - * Assumption: url is non-null and a valid URL object - * Assumption: sessionID is non-null - */ - public Pair<String, String> retrieveDetails(Integer sessionID, URL url) - throws InvalidSessionIDException, MalformedURLException, NoSuchURLException - { - //check that the session ID exists - String passbookUsername = userIDs.get(sessionID); - if (passbookUsername == null) { - throw new InvalidSessionIDException(sessionID); - } - else if (!Arrays.asList(VALID_URL_PROTOCOLS).contains(url.getProtocol())) { - throw new MalformedURLException(passbookUsername); - } - - PasswordTable pt = details.get(passbookUsername); - //if this returned nothing, the user has no details for any url - if (pt == null) { - throw new NoSuchURLException(passbookUsername, url); - } - - Pair<String, String> pair = pt.get(url); - - //if this returned nothing, the user does not have a login for this url - if (pair == null) { - throw new NoSuchURLException(passbookUsername, url); - } - - return pair; - } - - //A simple label to improve code readability - private class PasswordTable extends HashMap<URL, Pair<String, String>> {} -} diff --git a/programs/mutant-4/swen90006/passbook/WeakPassphraseException.java b/programs/mutant-4/swen90006/passbook/WeakPassphraseException.java deleted file mode 100644 index c4bc33b29151d824244eb0d5105db51e2c7473d1..0000000000000000000000000000000000000000 --- a/programs/mutant-4/swen90006/passbook/WeakPassphraseException.java +++ /dev/null @@ -1,14 +0,0 @@ -package swen90006.passbook; - -public class WeakPassphraseException extends Exception -{ - public WeakPassphraseException (String passphrase) - { - super("Passphrase does not comply with the PassBook rules\n" + - "\t- must contains at least " + - PassBook.MINIMUM_PASSPHRASE_LENGTH + " characters\n" + - "\t- must contain at least one numeric character\n" + - "\t- must contain at least one lower case letter\n" + - "\t- must contain at least one upper case letter\n"); - } -} diff --git a/programs/mutant-5/swen90006/passbook/AlreadyLoggedInException.java b/programs/mutant-5/swen90006/passbook/AlreadyLoggedInException.java deleted file mode 100644 index 8bbbd85f001ac2939928e48c8abfe63d253e36bc..0000000000000000000000000000000000000000 --- a/programs/mutant-5/swen90006/passbook/AlreadyLoggedInException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class AlreadyLoggedInException extends Exception -{ - public AlreadyLoggedInException(String username) - { - super("Username already logged in: " + username); - } -} diff --git a/programs/mutant-5/swen90006/passbook/DuplicateUserException.java b/programs/mutant-5/swen90006/passbook/DuplicateUserException.java deleted file mode 100644 index 74370b1668a24f83dae080aa184f8c39bda8bc79..0000000000000000000000000000000000000000 --- a/programs/mutant-5/swen90006/passbook/DuplicateUserException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class DuplicateUserException extends Exception -{ - public DuplicateUserException(String username) - { - super("Username already exists: " + username); - } -} diff --git a/programs/mutant-5/swen90006/passbook/IncorrectPassphraseException.java b/programs/mutant-5/swen90006/passbook/IncorrectPassphraseException.java deleted file mode 100644 index cdfc80b86dd71e1fc5bfc400538208e492c8bd9e..0000000000000000000000000000000000000000 --- a/programs/mutant-5/swen90006/passbook/IncorrectPassphraseException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class IncorrectPassphraseException extends Exception -{ - public IncorrectPassphraseException(String username, String passphrase) - { - super("Incorrect passphrase: " + passphrase + " for user " + username); - } -} diff --git a/programs/mutant-5/swen90006/passbook/InvalidSessionIDException.java b/programs/mutant-5/swen90006/passbook/InvalidSessionIDException.java deleted file mode 100644 index 230cf58af6c85eb884849950e6fe1070018f09a5..0000000000000000000000000000000000000000 --- a/programs/mutant-5/swen90006/passbook/InvalidSessionIDException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class InvalidSessionIDException extends Exception -{ - public InvalidSessionIDException(Integer sessionID) - { - super("Invalid session ID: " + sessionID); - } -} diff --git a/programs/mutant-5/swen90006/passbook/NoSuchURLException.java b/programs/mutant-5/swen90006/passbook/NoSuchURLException.java deleted file mode 100644 index 7edb9168412549fa63ee16bc3a2665069e0047af..0000000000000000000000000000000000000000 --- a/programs/mutant-5/swen90006/passbook/NoSuchURLException.java +++ /dev/null @@ -1,11 +0,0 @@ -package swen90006.passbook; - -import java.net.URL; - -public class NoSuchURLException extends Exception -{ - public NoSuchURLException (String username, URL url) - { - super("User " + username + " does not have password for URL " + url.toString()); - } -} diff --git a/programs/mutant-5/swen90006/passbook/NoSuchUserException.java b/programs/mutant-5/swen90006/passbook/NoSuchUserException.java deleted file mode 100644 index ca4c5270a875723fd8d6cbae389227ea685b13d4..0000000000000000000000000000000000000000 --- a/programs/mutant-5/swen90006/passbook/NoSuchUserException.java +++ /dev/null @@ -1,9 +0,0 @@ -package swen90006.passbook; - -public class NoSuchUserException extends Exception -{ - public NoSuchUserException (String username) - { - super("Username does not exist: " + username); - } -} diff --git a/programs/mutant-5/swen90006/passbook/Pair.java b/programs/mutant-5/swen90006/passbook/Pair.java deleted file mode 100644 index 8f70502f35d86c4e9e504be1e89a750d10f0d9cb..0000000000000000000000000000000000000000 --- a/programs/mutant-5/swen90006/passbook/Pair.java +++ /dev/null @@ -1,31 +0,0 @@ -package swen90006.passbook; - -/** - * A pair of objects. - */ -public class Pair<X, Y> -{ - private X first; - private Y second; - - public Pair(X first, Y second) - { - this.first = first; - this.second = second; - } - - public X getFirst() - { - return this.first; - } - - public Y getSecond() - { - return this.second; - } - - public boolean equals(Pair<X, Y> other) - { - return first.equals(other.first) && second.equals(other.second); - } -} diff --git a/programs/mutant-5/swen90006/passbook/PassBook.java b/programs/mutant-5/swen90006/passbook/PassBook.java deleted file mode 100644 index 94e2dfdcd19284dafa914ed1214ff926ea3318da..0000000000000000000000000000000000000000 --- a/programs/mutant-5/swen90006/passbook/PassBook.java +++ /dev/null @@ -1,262 +0,0 @@ -package swen90006.passbook; - -import java.util.Map; -import java.util.HashMap; -import java.util.Set; -import java.util.HashSet; -import java.net.URL; -import java.net.MalformedURLException; -import java.util.Random; -import java.util.Arrays; - -/** - * PassBook is a (fictional) online password manager. A password - * manager is a software application that generates, stores, and - * retrieves login details for users. - * - * A user has an account with PassBook. This account is protected by a - * master password, or passphrase. Each user can store login details - * for multiple websites, identified by their URL. A user can add a - * login details for a given website. The passphrase is used to - * encrypt all passwords, but for this implementation, we have ignored - * encryption. - * - * The PassBook passphrase must conform to the following requirements: - * Must be at least eight characters long and contain at - * least one digit (range 0-9), one letter in the range 'a'-'z', and - * one letter in the range 'A'-'Z'. - * - * Username and passwords for stored URLs have no password - * requirements. - * - * When a user logs into PassBook, they are given a session ID. This - * session ID is used to identify them for all transactions until they - * log out. - */ -public class PassBook -{ - /** The minimum length of a passphrase */ - public final static int MINIMUM_PASSPHRASE_LENGTH = 8; - - /** Valid URL protocols for the passbook */ - public final static String [] VALID_URL_PROTOCOLS = {"http", "https"}; - - //The passphrases (master passwords) for all users - private Map<String, String> passphrases; - - //The login details for all users and the URLs they have stored - private Map<String, PasswordTable> details; - - //Mapping from session IDs to usernames - private Map<Integer, String> userIDs; - - //Mapping from usernames to sessionIDs - private Map<String, Integer> sessionIDs; - - /** - * Constructs an empty passbook. - */ - public PassBook() - { - passphrases = new HashMap<String, String>(); - details = new HashMap<String, PasswordTable>(); - userIDs = new HashMap<Integer, String>(); - sessionIDs = new HashMap<String, Integer>(); - } - - /** - * Adds a new user to the passbook. - * - * @param passbookUsername the username for the user to be added - * @param passphrase the passphrase (master password) for the user - * @throws DuplicateUserException if the username is already in the passbook - * @throws WeakPassphraseException if the password does not fit the passphrase - rules (see class documentation) - * - * Assumption: passbookUsername and passphrase are non-null - */ - public void addUser(String passbookUsername, String passphrase) - throws DuplicateUserException, WeakPassphraseException - { - //Check if this user exists - if (passphrases.containsKey(passbookUsername)) { - throw new DuplicateUserException(passbookUsername); - } - //check the passphrase strength - else { - if (passphrase.length() < MINIMUM_PASSPHRASE_LENGTH) { - throw new WeakPassphraseException(passphrase); - } - - boolean containsLowerCase = false; - boolean containsUpperCase = false; - boolean containsNumber = false; - for (int i = 0; i < passphrase.length(); i++) { - - if ('a' <= passphrase.charAt(i) && passphrase.charAt(i) <= 'z') { - containsLowerCase = true; - } - else if ('A' <= passphrase.charAt(i) && passphrase.charAt(i) <= 'Z') { - containsUpperCase = true; - } - else if ('0' <= passphrase.charAt(i) && passphrase.charAt(i) <= '9') { - containsNumber = true; - } - } - - if (!containsLowerCase || !containsUpperCase || !containsNumber) { - throw new WeakPassphraseException(passphrase); - } - } - - passphrases.put(passbookUsername, passphrase); - PasswordTable pt = new PasswordTable(); - details.put(passbookUsername, pt); - } - - /** - * Checks if a user exists - * @param passbookUsername the passbookUsername - * @return true if and only if this user is in the passbook - * - * Assumption: passbookUsername is non-null - */ - public boolean isUser(String passbookUsername) - { - return passphrases.containsKey(passbookUsername); - } - - /** - * Logs a user into the passbook. - * - * @param passbookUsername the passbookUsername for the user - * @param passphrase the passphrase (master password) for the user - * @returns a session ID greater than or equal to 0 - * @throws NoSuchUserException if the user does not exist in the passbook - * @throws AlreadyLoggedInException if the user is already logged in - * @throws IncorrectPassphraseException if the passphrase is incorrect for this user - * - * Assumption: passbookUsername and passphrase are non-null - */ - public int loginUser(String passbookUsername, String passphrase) - throws NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException - { - //check that the user exists - if (!passphrases.containsKey(passbookUsername)) { - throw new NoSuchUserException(passbookUsername); - } - else if (sessionIDs.get(passbookUsername) != null) { - throw new AlreadyLoggedInException(passbookUsername); - } - else if (!passphrases.get(passbookUsername).equals(passphrase)) { - throw new IncorrectPassphraseException(passbookUsername, passphrase); - } - - //generate a random session ID that is not already taken - int sessionID = new Random().nextInt(Integer.MAX_VALUE); - while (userIDs.containsKey(sessionID)) { - sessionID = new Random().nextInt(Integer.MAX_VALUE); - } - - //add the session ID - sessionIDs.put(passbookUsername, sessionID); - userIDs.put(sessionID, passbookUsername); - - return sessionID; - } - - /** - * Logs out a user based on session ID. Has no affect if the session ID does not exist. - * - * @param sessionID the session ID to be terminated - * - * Assumption: session ID is non-null - */ - public void logoutUser(Integer sessionID) - { - sessionIDs.remove(userIDs.get(sessionID)); - userIDs.remove(sessionID); - } - - /** - * Updates the login details for a URL of a user. If the url - * username or password are null, the login details for this URL - * must be removed. - * - * @param sessionID the session ID for the logged-in user - * @param urlUsername the username for the user to be added - * @param url the URL for the username/password pair - * @param urlPassword the password to be add - * @throws InvalidSessionIDException if the session ID does not exists - * @throws MalformedURLException if the protocol is not 'http' or 'https' - * - * Assumption: url is non-null and a valid URL object - * Assumption: sessionID is non-null - */ - public void updateDetails(Integer sessionID, URL url, String urlUsername, String urlPassword) - throws InvalidSessionIDException, MalformedURLException - { - //check that the session ID exists - String passbookUsername = userIDs.get(sessionID); - if (passbookUsername == null) { - throw new InvalidSessionIDException(sessionID); - } - else if (!Arrays.asList(VALID_URL_PROTOCOLS).contains(url.getProtocol())) { - throw new MalformedURLException(passbookUsername); - } - - PasswordTable pt = details.get(passbookUsername); - if (urlUsername == null || urlPassword == null) { - pt.remove(url); - } - else { - pt.put(url, new Pair<String, String> (urlUsername, urlPassword)); - details.put(passbookUsername, pt); - } - } - - - /** - * Retrieves login details for a given URL and user. - * - * @param sessionID the session ID - * @param url the URL for the password being retrieved. - * @returns the username and password for a given url for the corresponding user - * @throws NoSuchUserException if the username does not exist in the passbook - * @throws MalformedURLException if the syntax is invalid (see class documentation) - * @throws NoSuchURLException if user does not have login for this URL - * - * Assumption: url is non-null and a valid URL object - * Assumption: sessionID is non-null - */ - public Pair<String, String> retrieveDetails(Integer sessionID, URL url) - throws InvalidSessionIDException, MalformedURLException, NoSuchURLException - { - //check that the session ID exists - String passbookUsername = userIDs.get(sessionID); - if (passbookUsername == null) { - throw new InvalidSessionIDException(sessionID); - } - else if (!Arrays.asList(VALID_URL_PROTOCOLS).contains(url.getProtocol())) { - throw new MalformedURLException(passbookUsername); - } - - PasswordTable pt = details.get(passbookUsername); - //if this returned nothing, the user has no details for any url - if (pt == null) { - throw new NoSuchURLException(passbookUsername, url); - } - - Pair<String, String> pair = pt.get(url); - - //if this returned nothing, the user does not have a login for this url - if (pair == null) { - throw new NoSuchURLException(passbookUsername, url); - } - - return pair; - } - - //A simple label to improve code readability - private class PasswordTable extends HashMap<URL, Pair<String, String>> {} -} diff --git a/programs/mutant-5/swen90006/passbook/WeakPassphraseException.java b/programs/mutant-5/swen90006/passbook/WeakPassphraseException.java deleted file mode 100644 index c4bc33b29151d824244eb0d5105db51e2c7473d1..0000000000000000000000000000000000000000 --- a/programs/mutant-5/swen90006/passbook/WeakPassphraseException.java +++ /dev/null @@ -1,14 +0,0 @@ -package swen90006.passbook; - -public class WeakPassphraseException extends Exception -{ - public WeakPassphraseException (String passphrase) - { - super("Passphrase does not comply with the PassBook rules\n" + - "\t- must contains at least " + - PassBook.MINIMUM_PASSPHRASE_LENGTH + " characters\n" + - "\t- must contain at least one numeric character\n" + - "\t- must contain at least one lower case letter\n" + - "\t- must contain at least one upper case letter\n"); - } -} diff --git a/tests/Partitioning/swen90006/passbook/PartitioningTests.java b/tests/Partitioning/swen90006/passbook/PartitioningTests.java index 309237c89aa7b7c2adc959253469695919aabbfe..8babf1d529c3e3911aa85da7a92abda4d40d90b4 100644 --- a/tests/Partitioning/swen90006/passbook/PartitioningTests.java +++ b/tests/Partitioning/swen90006/passbook/PartitioningTests.java @@ -191,7 +191,7 @@ public class PartitioningTests boolean NoSuchUserException = false; String passbookUsername = "Sam"; String passbookphrase = "123456aA"; - String passbookUsername2 = "Sam"; + String passbookUsername2 = "SaM"; String passbookphrase2 = "123456aA"; try { pb.addUser(passbookUsername,passbookphrase); @@ -322,6 +322,7 @@ public class PartitioningTests boolean MalformedURLException = false; Integer sessionID ; String Username = "Sam"; + String Password = "123456aA"; String urlUsername = "Sam"; String urlPassword = "123456aA"; pb.addUser(Username,Password);