-
Notifications
You must be signed in to change notification settings - Fork 0
Laboration 3 #1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Laboration 3 #1
Changes from all commits
338bcfe
5dac824
c0e2385
221d81e
98459f5
adbc0db
5c4fc26
0b4dbf0
e694ea8
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -14,30 +14,53 @@ static void main(String[] args) { | |
| } | ||
|
|
||
| /** | ||
| * Kör huvudflödet för applikationen, inklusive inloggning och enkel meny för att lista månfärder. | ||
| * <p> | ||
| * Vad som har lagts till i denna version: | ||
| * Kör huvudflödet för applikationen, inklusive inloggning och enkel meny för att lista månfärder, | ||
| * skapa nya konton och ta bort konton. | ||
| * <p> | ||
| * Skapar en Scanner för användarinput. | ||
| * Frågar användaren efter användarnamn och lösenord och kontrollerar dessa mot databasen. | ||
| * Om inloggning lyckas skrivs "Login successful!" ut, annars avslutas programmet med felmeddelande. | ||
| * Efter lyckad inloggning visas en enkel meny med två alternativ: | ||
| * Efter lyckad inloggning visas en enkel meny med följande alternativ: | ||
| * <p> | ||
| * 1) Lista alla månfärder (namn på rymdfarkoster) | ||
| * Hämtar alla rymdfarkoster från tabellen "moon_mission" och skriver ut dem i ordning | ||
| * efter mission_id. Användaren får en snabb översikt över vilka månfärder som finns | ||
| * registrerade i databasen. | ||
| * <p> | ||
| * 2) Hämta månfärd efter mission_id | ||
| * Frågar efter ett specifikt mission_id och hämtar information om månfärden med det ID:t. | ||
| * Om månfärden finns skrivs namnet på rymdfarkosten ut, annars meddelas att månfärden inte | ||
| * hittades. | ||
| * <p> | ||
| * 3) Räkna månfärder för ett visst år | ||
| * Frågar användaren efter ett år och räknar antalet månfärder som har launch_date inom | ||
| * det året. Resultatet visar hur många månfärder som genomfördes under det valda året. | ||
| * <p> | ||
| * Lista alla månfärder (namn på rymdfarkoster). | ||
| * Avsluta programmet. | ||
| * 4) Skapa ett nytt konto (förnamn, efternamn, SSN, lösenord) | ||
| * Frågar efter användarens förnamn, efternamn, SSN och lösenord och skapar ett nytt konto | ||
| * i tabellen "account". Detta gör det möjligt för nya användare att registrera sig. | ||
| * <p> | ||
| * Valet "Lista månfärder" hämtar alla rymdfarkoster från tabellen "moon_mission" och skriver ut dem i ordning eftermission_id. | ||
| * Valet "Avsluta" bryter menyn och avslutar metoden. | ||
| * Ogiltiga val hanteras med ett felmeddelande. | ||
| * 5) Uppdatera lösenord för ett konto via user_id | ||
| * Frågar efter user_id för kontot som ska uppdateras samt det nya lösenordet. Uppdaterar | ||
| * kontots lösenord i databasen om kontot finns, annars meddelas att inget konto med | ||
| * angivet ID hittades. | ||
| * <p> | ||
| * 6) Ta bort ett konto via user_id | ||
| * Frågar efter user_id för kontot som ska tas bort och tar bort kontot från tabellen | ||
| * "account". Om kontot inte finns meddelas användaren om att inget konto hittades. | ||
| * <p> | ||
| * 0) Avsluta programmet | ||
| * Bryter menyn och avslutar metoden. | ||
| * <p> | ||
| * Ogiltiga val hanteras med felmeddelanden. | ||
| */ | ||
| public void run() { | ||
| // Resolve DB settings with precedence: System properties -> Environment variables | ||
| String jdbcUrl = resolveConfig("APP_JDBC_URL", "APP_JDBC_URL"); | ||
| String dbUser = resolveConfig("APP_DB_USER", "APP_DB_USER"); | ||
| String dbPass = resolveConfig("APP_DB_PASS", "APP_DB_PASS"); | ||
|
|
||
| if (jdbcUrl == null || dbUser == null || dbPass == null) { | ||
| throw new IllegalStateException( | ||
| throw new IllegalStateException( | ||
| "Missing DB configuration. Provide APP_JDBC_URL, APP_DB_USER, APP_DB_PASS " + | ||
| "as system properties (-Dkey=value) or environment variables."); | ||
| } | ||
|
|
@@ -74,22 +97,133 @@ public void run() { | |
|
|
||
| while (true) { | ||
| System.out.println("1) List moon missions"); | ||
| System.out.println("2) Get mission by ID"); | ||
| System.out.println("3) Count missions for year"); | ||
| System.out.println("4) Create new account"); | ||
| System.out.println("5) Update account password"); | ||
| System.out.println("6) Delete account"); | ||
| System.out.println("0) Exit"); | ||
|
|
||
| String choice = scanner.nextLine().trim(); | ||
| if ("0".equals(choice)) { | ||
| break; | ||
| } else if ("1".equals(choice)) { | ||
| try (PreparedStatement ps = connection.prepareStatement( | ||
| "SELECT spacecraft FROM moon_mission ORDER BY mission_id" | ||
| )) { | ||
| ResultSet rs = ps.executeQuery(); | ||
| while (rs.next()) { | ||
| System.out.println(rs.getString("spacecraft")); | ||
|
|
||
| switch (choice) { | ||
| case "0" -> { | ||
| return; | ||
| } | ||
| case "1" -> { | ||
| try (PreparedStatement ps = connection.prepareStatement( | ||
| "SELECT spacecraft FROM moon_mission ORDER BY mission_id" | ||
| )) { | ||
| ResultSet rs = ps.executeQuery(); | ||
| while (rs.next()) { | ||
| System.out.println(rs.getString("spacecraft")); | ||
| } | ||
| } | ||
| } | ||
| case "2" -> { | ||
| System.out.println("Mission ID:"); | ||
| int id; | ||
| try { | ||
| id = Integer.parseInt(scanner.nextLine().trim()); | ||
| } catch (NumberFormatException e) { | ||
| System.out.println("Invalid mission ID"); | ||
| break; | ||
| } | ||
| try (PreparedStatement ps = connection.prepareStatement( | ||
| "SELECT spacecraft FROM moon_mission WHERE mission_id = ?" | ||
| )) { | ||
| ps.setInt(1, id); | ||
| ResultSet rs = ps.executeQuery(); | ||
| if (rs.next()) { | ||
|
|
||
| System.out.println(rs.getString("spacecraft")); | ||
| } else { | ||
| System.out.println("Mission not found"); | ||
| } | ||
| } | ||
| } | ||
| } else { | ||
| System.out.println("Invalid option"); | ||
|
|
||
| case "3" -> { | ||
| System.out.println("Year:"); | ||
| int year; | ||
| try { | ||
| year = Integer.parseInt(scanner.nextLine().trim()); | ||
| } catch (NumberFormatException e) { | ||
| System.out.println("Invalid year"); | ||
| break; | ||
| } | ||
| try (PreparedStatement ps = connection.prepareStatement( | ||
| "SELECT COUNT(*) FROM moon_mission WHERE YEAR(launch_date) = ?" | ||
| )) { | ||
| ps.setInt(1, year); | ||
| ResultSet rs = ps.executeQuery(); | ||
| rs.next(); | ||
| int count = rs.getInt(1); | ||
| System.out.println(year + " missions: " + count); | ||
| } | ||
| } | ||
|
coderabbitai[bot] marked this conversation as resolved.
|
||
|
|
||
| case "4" -> { | ||
| System.out.println("First name:"); | ||
| String firstName = scanner.nextLine().trim(); | ||
| System.out.println("Last name:"); | ||
| String lastName = scanner.nextLine().trim(); | ||
| System.out.println("SSN:"); | ||
| String ssn = scanner.nextLine().trim(); | ||
| System.out.println("Password:"); | ||
| String accountPassword = scanner.nextLine().trim(); | ||
|
|
||
| try (PreparedStatement ps = connection.prepareStatement( | ||
| "INSERT INTO account(password, first_name, last_name, ssn) VALUES (?, ?, ?, ?)" | ||
| )) { | ||
| ps.setString(1, accountPassword); | ||
| ps.setString(2, firstName); | ||
| ps.setString(3, lastName); | ||
| ps.setString(4, ssn); | ||
| ps.executeUpdate(); | ||
| } | ||
|
|
||
| System.out.println("Account created"); | ||
| } | ||
|
Comment on lines
+166
to
+187
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Critical security issues: plaintext passwords and PII handling. Multiple security vulnerabilities identified:
Implement password hashing and SSN encryption before storing these values. Add input validation and duplicate checking to improve data integrity. |
||
|
|
||
| case "5" -> { | ||
| System.out.println("User ID of account to update:"); | ||
| long userId = Long.parseLong(scanner.nextLine().trim()); | ||
| System.out.println("New password:"); | ||
| String newPassword = scanner.nextLine().trim(); | ||
|
|
||
| try (PreparedStatement ps = connection.prepareStatement( | ||
| "UPDATE account SET password = ? WHERE user_id = ?" | ||
| )) { | ||
| ps.setString(1, newPassword); | ||
| ps.setLong(2, userId); | ||
| int rows = ps.executeUpdate(); | ||
| if (rows > 0) { | ||
| System.out.println("Password updated"); | ||
| } else { | ||
| System.out.println("No account found with that ID"); | ||
| } | ||
| } | ||
| } | ||
|
Comment on lines
+189
to
207
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Critical security issues: missing authorization, plaintext passwords, and account enumeration. Multiple critical and major security issues:
Required fixes:
🤖 Prompt for AI Agents |
||
|
|
||
| case "6" -> { | ||
| System.out.println("User ID of account to delete:"); | ||
| long userId = Long.parseLong(scanner.nextLine().trim()); | ||
|
|
||
| try (PreparedStatement ps = connection.prepareStatement( | ||
| "DELETE FROM account WHERE user_id = ?" | ||
| )) { | ||
| ps.setLong(1, userId); | ||
| int rows = ps.executeUpdate(); | ||
| if (rows > 0) { | ||
| System.out.println("Account deleted"); | ||
| } else { | ||
| System.out.println("No account found with that ID"); | ||
| } | ||
| } | ||
| } | ||
|
Comment on lines
+209
to
+224
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Critical security issue: missing authorization and safety checks. Multiple critical security issues:
Required fixes:
🤖 Prompt for AI Agents |
||
|
|
||
| default -> System.out.println("Invalid option"); | ||
| } | ||
| } | ||
|
|
||
|
|
@@ -106,11 +240,11 @@ public void run() { | |
| * @return {@code true} if the application is in development mode; {@code false} otherwise | ||
| */ | ||
| private static boolean isDevMode(String[] args) { | ||
| if (Boolean.getBoolean("devMode")) //Add VM option -DdevMode=true | ||
| if (Boolean.getBoolean("devMode")) | ||
| return true; | ||
| if ("true".equalsIgnoreCase(System.getenv("DEV_MODE"))) //Environment variable DEV_MODE=true | ||
| if ("true".equalsIgnoreCase(System.getenv("DEV_MODE"))) | ||
| return true; | ||
| return Arrays.asList(args).contains("--dev"); //Argument --dev | ||
| return Arrays.asList(args).contains("--dev"); | ||
| } | ||
|
|
||
| /** | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.