content: package ciscoroutertool.settings;
  
  import nu.xom.Builder;
  import nu.xom.Document;
  import nu.xom.Element;
  import nu.xom.ParsingException;
  
  import java.io.File;
  import java.io.FileWriter;
  import java.io.IOException;
  import java.nio.file.Files;
  import java.security.NoSuchAlgorithmException;
  import java.security.spec.InvalidKeySpecException;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  
  /**
   * Manages the Settings for the Application.
   * @version 0.01ALPHA
   * @author Andrew Johnston
   */
  public class SettingsManager {
  
      /**
       * The username to log in to the app
       */
      private String  username;
  
      /**
       * The password to log in to the app
       */
      private String  password;
  
      /**
       * The unhashed version of the username (used for forms)
       */
      private String  unhashedUsername;
  
      /**
       * A boolean that indicates if authentication is currently enabled.
       */
      private boolean requiresAuth;
      
      /**
       * Constructs the class. Requires settings.xml to be present to run
       */
      public SettingsManager() {
          String currentDir = System.getProperty("user.dir");
          String settingDir = currentDir + "/settings/";
          File f = new File(settingDir + "settings.xml");
          if (f.exists() && !f.isDirectory()) {
              try {
                  Builder parser = new Builder();
                  Document doc   = parser.build(f);
                  Element root   = doc.getRootElement();
  
                  Element eUsername = root.getFirstChildElement("Username");
                  username = eUsername.getValue();
  
                  Element ePassword = root.getFirstChildElement("Password");
                  password = ePassword.getValue();
  
                  requiresAuth = true;
              } catch (ParsingException|IOException e) {
                  e.printStackTrace();
              }
          }
          else {
              requiresAuth = false;
          }
      }
      
      
      /**
       * Checks if Authentication is required to use the application
       * @return true if authentication is required
       */
      public boolean requiresAuth() {
          return requiresAuth;
      }
  
      /**
       * Returns the username needed to access the app
       */
      public String getUsername() {
          return unhashedUsername;
      }
  
      /**
       * Deletes the settings file if auth is turned off
       */
      public void removeSecurity() {
          requiresAuth = false;
          File f = new File(System.getProperty("user.dir") + "/settings/settings.xml");
          if (f.exists()) {
              try {
                  Files.deleteIfExists(f.toPath());
              } catch (IOException e) {
                  //Fail silently
              }
          }
      }
  
      /**
       * Returns the password needed to access the app
       */
      public String getPassword() {
          return password;
      }
      
      /**
       * Checks the provided credentials against stored counterparts
       * @param _username The username provided by the user
       * @param _password The password provided by the user
       * @return true if the credentials are correct
       */
      public boolean checkAuth(String _username, String _password) {
          boolean isCorrectUsername = false;
          boolean isCorrectPassword = false;
          try {
              if (PasswordHash.validatePassword(_username, username)) {
                  isCorrectUsername = true;
                  unhashedUsername = _username;
              }
              if (PasswordHash.validatePassword(_password, password)) {
                 isCorrectPassword = true;
              }
          } catch (NoSuchAlgorithmException | InvalidKeySpecException ex) {
              Logger.getLogger(SettingsManager.class.getName()).log(Level.SEVERE, null, ex);
          }
          return (isCorrectUsername && isCorrectPassword);
      }
  
      /**
       * Sets the username and password for authenticating to the application
       * @param _username the username to save
       * @param _password the password to save
       */
      public void setAuth(String _username, String _password) {
          String hashedPassword;
          String hashedUsername;
          try {
              hashedPassword = PasswordHash.createHash(_password);
              hashedUsername = PasswordHash.createHash(_username);
              File settingsFile = new File(System.getProperty("user.dir") + "/settings/settings.xml");
              FileWriter fw = new FileWriter(settingsFile, false);
  
              Element root = new Element("Settings");
  
              Element user = new Element("Username");
              user.appendChild(hashedUsername);
              root.appendChild(user);
  
              Element pass = new Element("Password");
              pass.appendChild(hashedPassword);
              root.appendChild(pass);
  
              Document doc = new Document(root);
              fw.write(doc.toXML());
              fw.flush();
              fw.close();
  
          } catch (NoSuchAlgorithmException | InvalidKeySpecException | IOException ex) {
              Logger.getLogger(SettingsManager.class.getName()).log(Level.SEVERE, null, ex);
          }
          requiresAuth = true;
          username = _username;
          password = _password;
      }
  
  }
  