You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
4.9 KiB

  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.Modifier;
  7. import java.nio.charset.StandardCharsets;
  8. import java.util.ArrayList;
  9. import java.util.Scanner;
  10. public class PasswordManager implements PasswordManagerInterface {
  11. boolean running = true;
  12. InputStream inputStream = System.in;
  13. OutputStream outputStream = System.out;
  14. ArrayList<Vault> vaults = new ArrayList<>();
  15. int selectedVaultId = -1;
  16. ArrayList<String> vaultOperationOptions = new ArrayList<>();
  17. public static void main(String[] args) {
  18. PasswordManager pm = new PasswordManager();
  19. while (pm.running) {
  20. pm.showMenu();
  21. }
  22. System.exit(0);
  23. }
  24. public PasswordManager() {
  25. println("Hello World");
  26. }
  27. private void println(String output) {
  28. try {
  29. outputStream.write((output + "\n").getBytes(StandardCharsets.UTF_8));
  30. } catch (IOException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. @Override
  35. public void listVaults() {
  36. println("Vaults:");
  37. for (int i = 0; i < vaults.size(); i++) {
  38. println("- vault id: " + i);
  39. }
  40. }
  41. public void createNewVault() {
  42. vaults.add(new Vault());
  43. }
  44. @Override
  45. public void openVault() {
  46. }
  47. @Override
  48. public void showMenu() {
  49. StringBuilder sb = new StringBuilder();
  50. Scanner scan = new Scanner(inputStream);
  51. running = true;
  52. sb.append("\nciip Gruppe 8 - Password Manager\n\n");
  53. sb.append("Menu:\n");
  54. sb.append("- list vaults: l\n");
  55. sb.append("- create new vault: v\n");
  56. sb.append("- select vault and show operations: v x (replace x with vault id)\n");
  57. sb.append("- select vault operation: o x (replace o with a operation id for the selected vault)\n");
  58. sb.append("- exit: e\n");
  59. println(sb.toString());
  60. String input = scan.nextLine();
  61. if (input.equals("e")) {
  62. running = false;
  63. } else if (input.equals("l")) {
  64. listVaults();
  65. } else if (input.equals("v")) {
  66. createNewVault();
  67. } else if (input.startsWith("v")) {
  68. String vaultAction = (input.replace('v', ' ')).trim();
  69. int vaultId = -1;
  70. try {
  71. vaultId = Integer.parseInt(vaultAction);
  72. } catch (NumberFormatException e) {
  73. println("-- please enter a correct vault id");
  74. }
  75. if (vaultId >= 0) {
  76. selectedVaultId = vaultId;
  77. println("\nVault " + vaultId + " selected.");
  78. try {
  79. int internalOptionCounter = 0;
  80. println("\nAvailable vault operations:");
  81. for (Method m : Class.forName("Vault").getDeclaredMethods()) { // returns all declared methods including private or protected
  82. try {
  83. if (Modifier.isPublic(Class.forName("Vault").getDeclaredMethod(m.getName()).getModifiers())) { // filter out methods that are not public (using Modifier) or have arguments (using getDeclaredMethod)
  84. vaultOperationOptions.add(m.getName());
  85. println(internalOptionCounter + " - " + m.getName());
  86. internalOptionCounter++;
  87. }
  88. } catch (NoSuchMethodException ignore) {
  89. // println("No method with name " + m.getName() + " found");
  90. }
  91. }
  92. } catch (ClassNotFoundException e) {
  93. println("-- vaults not implemented yet");
  94. }
  95. }
  96. } else if (input.startsWith("o")) {
  97. String operation = (input.replace('o', ' ')).trim();
  98. int operationId = -1;
  99. try {
  100. operationId = Integer.parseInt(operation);
  101. } catch (NumberFormatException e) {
  102. println("-- please enter a valid operation id");
  103. }
  104. if (selectedVaultId < 0) {
  105. println("-- a vault needs to be selected");
  106. } else if (operationId >= 0 && operationId < vaultOperationOptions.size()) {
  107. Vault vault = vaults.get(selectedVaultId);
  108. try {
  109. println("Run selected operation '" + vaultOperationOptions.get(operationId) + "':");
  110. vault.getClass().getDeclaredMethod(vaultOperationOptions.get(operationId)).invoke(vault);
  111. } catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
  112. e.printStackTrace();
  113. println("-- selected operation failed");
  114. }
  115. } else {
  116. println("-- please enter a valid operation id");
  117. }
  118. }
  119. }
  120. }