From ab743605712a70ebe5da6123a1d03de8da0111d4 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Sun, 11 Aug 2024 18:31:15 +0200 Subject: [PATCH] Add IP address tracking for form submissions Included IP and timestamp columns in the database schema to track form submissions. Updated methods to handle and store the IP information upon form submission. Adjusted related test cases to validate the new implementation. --- .idea/workspace.xml | 23 ++++++++++++++----- .../forms/controlers/FormRequestHandler.java | 2 +- .../com/alttd/forms/database/Database.java | 4 +++- .../com/alttd/forms/form/StoreFormQuery.java | 19 +++++++-------- src/test/java/TestForm.java | 2 +- 5 files changed, 32 insertions(+), 18 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index e9ec169..3cf3d9b 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,8 +4,11 @@ - @@ -717,7 +727,8 @@ - diff --git a/src/main/java/com/alttd/forms/controlers/FormRequestHandler.java b/src/main/java/com/alttd/forms/controlers/FormRequestHandler.java index 7c1bd0b..b3e9116 100644 --- a/src/main/java/com/alttd/forms/controlers/FormRequestHandler.java +++ b/src/main/java/com/alttd/forms/controlers/FormRequestHandler.java @@ -16,7 +16,7 @@ public class FormRequestHandler { private static final Logger logger = LoggerFactory.getLogger(FormRequestHandler.class); public static CompletableFuture> handleRequestWithVerifyMail(Form form, String ip) { - CompletableFuture storeFormForVerificationCode = new StoreFormQuery().storeFormForVerificationCode(form.getSender(), form); + CompletableFuture storeFormForVerificationCode = new StoreFormQuery().storeFormForVerificationCode(form.getSender(), form, ip); return storeFormForVerificationCode.thenCompose(code -> Verify.verifyEmail(ip, form.getSender(), code, form).thenApply(verificationResult -> { if (verificationResult == VerificationResult.VERIFICATION_SENT) { //TODO if this is ok tell the user they have x min to verify if they fail to do so they have to remake the form diff --git a/src/main/java/com/alttd/forms/database/Database.java b/src/main/java/com/alttd/forms/database/Database.java index a5a3e45..8651f43 100644 --- a/src/main/java/com/alttd/forms/database/Database.java +++ b/src/main/java/com/alttd/forms/database/Database.java @@ -8,7 +8,7 @@ import java.sql.SQLException; public class Database { - private static final Logger logger = LoggerFactory.getLogger(Database.class); //TODO can be replaced with library and that one db file that creates the db + private static final Logger logger = LoggerFactory.getLogger(Database.class); public static void createTables() { String[] createTables = { @@ -28,6 +28,8 @@ public class Database { creation_date BIGINT NOT NULL, form_json TEXT NOT NULL, form_class VARCHAR(64) NOT NULL, + ip VARCHAR(45) not null, + time TIMESTAMP default current_timestamp() not null, PRIMARY KEY(formId) ) """, diff --git a/src/main/java/com/alttd/forms/form/StoreFormQuery.java b/src/main/java/com/alttd/forms/form/StoreFormQuery.java index 222e92b..e08ba31 100644 --- a/src/main/java/com/alttd/forms/form/StoreFormQuery.java +++ b/src/main/java/com/alttd/forms/form/StoreFormQuery.java @@ -21,29 +21,30 @@ public class StoreFormQuery { return 100000 + random.nextInt(900000); } - private Optional insertForm(Connection connection, Form form) { - String insertForm = "INSERT INTO form (creation_date, form_json, form_class) VALUES (?, ?, ?)"; + private Optional insertForm(Connection connection, Form form, String ip) { + String insertForm = "INSERT INTO form (creation_date, form_json, form_class, ip) VALUES (?, ?, ?, ?)"; try (PreparedStatement stmt = connection.prepareStatement(insertForm, Statement.RETURN_GENERATED_KEYS)) { stmt.setLong(1, Instant.now().toEpochMilli()); stmt.setString(2, form.toJsonString()); stmt.setString(3, form.getClass().getSimpleName()); + stmt.setString(4, ip); int affectedRows = stmt.executeUpdate(); if (affectedRows == 0) { - logger.error("No rows affected during insert of form: " + form); + logger.error("No rows affected during insert of form: {}", form); return Optional.empty(); } ResultSet generatedKeys = stmt.getGeneratedKeys(); if (generatedKeys.next()) { return Optional.of(generatedKeys.getLong(1)); } else { - logger.error("No primary key generated when inserting form " + form); + logger.error("No primary key generated when inserting form {}", form); return Optional.empty(); } } catch (SQLException e) { - logger.error("Failed insert form query for: " + form, e); + logger.error("Failed insert form query for: {}", form, e); return Optional.empty(); } catch (JsonProcessingException e) { - logger.error("Invalid class for JSON, failed insert form query for: " + form, e); + logger.error("Invalid class for JSON, failed insert form query for: {}", form, e); return Optional.empty(); } } @@ -58,17 +59,17 @@ public class StoreFormQuery { stmt.executeUpdate(); return Optional.of(verificationCode); } catch (SQLException e) { - logger.error("Failed to insert verification code for form with id: " + formId); + logger.error("Failed to insert verification code for form with id: {}", formId); return Optional.empty(); } } - public CompletableFuture storeFormForVerificationCode(String eMail, Form form) { + public CompletableFuture storeFormForVerificationCode(String eMail, Form form, String ip) { logger.debug("storeFormForVerificationCode"); Connection connection = DatabaseConnection.getConnection(); logger.trace("Connection: {}", connection); return CompletableFuture.supplyAsync(() -> { - Optional optionalFormId = insertForm(connection, form); + Optional optionalFormId = insertForm(connection, form, ip); logger.trace("Form id: {}", optionalFormId); if (optionalFormId.isEmpty()) { throw new RuntimeException("Failed to store form"); diff --git a/src/test/java/TestForm.java b/src/test/java/TestForm.java index 3d4db08..548b92e 100644 --- a/src/test/java/TestForm.java +++ b/src/test/java/TestForm.java @@ -23,7 +23,7 @@ public class TestForm { Assertions.assertDoesNotThrow(() -> DatabaseConnection.initialize()); StoreFormQuery storeFormQuery = new StoreFormQuery(); ContactFormData contactFormData = new ContactFormData("akastijn", "akastijn@alttd.com", "This is a test question."); - storeFormQuery.storeFormForVerificationCode("akastijn@alttd.com", contactFormData). + storeFormQuery.storeFormForVerificationCode("akastijn@alttd.com", contactFormData, "0.0.0.0"). thenAccept(code -> { TestForm.code = code; Assertions.assertTrue(code > 999 && code < 10000);