From b1ca58bd1ad5cf99dc213e0c3a9b793e99b92a42 Mon Sep 17 00:00:00 2001 From: Matthias Guillitte Date: Wed, 3 Dec 2025 15:51:04 +0100 Subject: [PATCH] ExternalApp : Premier jet # Conflicts: # src/main/java/externalApp/externalApp/src/Main.java --- .../java/common/common/src/ports/Ports.java | 9 +++ .../externalApp/externalApp/src/Main.java | 70 ++++++++++++++++++- 2 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 src/main/java/common/common/src/ports/Ports.java diff --git a/src/main/java/common/common/src/ports/Ports.java b/src/main/java/common/common/src/ports/Ports.java new file mode 100644 index 0000000..896e47f --- /dev/null +++ b/src/main/java/common/common/src/ports/Ports.java @@ -0,0 +1,9 @@ +package common.common.src.ports; + +public class Ports { + /** + * Port d'écoute du service ACS pour la communication avec l'application externe. + */ + public static int PORT_AUTH = 8786; + public static String ACS_HOST = "127.0.0.1"; +} diff --git a/src/main/java/externalApp/externalApp/src/Main.java b/src/main/java/externalApp/externalApp/src/Main.java index 749d097..aa907b7 100644 --- a/src/main/java/externalApp/externalApp/src/Main.java +++ b/src/main/java/externalApp/externalApp/src/Main.java @@ -1,9 +1,75 @@ package externalApp.externalApp.src; +import common.common.src.ports.Ports; import common.common.src.logger.Logger; +import org.gradle.internal.impldep.com.fasterxml.jackson.databind.ObjectMapper; +import org.gradle.internal.impldep.com.fasterxml.jackson.databind.node.ObjectNode; + +import javax.net.ssl.HttpsURLConnection; +import java.io.*; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.security.*; +import java.security.cert.CertificateException; +import java.util.Base64; public class Main { - public static void main(String[] args) { - Logger.displayInfo("Hello World"); + public static void main(String[] args) throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, InvalidKeyException, SignatureException, URISyntaxException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + System.out.println("Quel est la date d'expiration de la carte de crédit ? (MM/AA)"); + String expirationDate = br.readLine(); + Logger.displayInfo("Date d'expiration saisie : " + expirationDate); + System.out.println("Numéro de la carte de crédit : "); + String cardNumber = br.readLine(); + Logger.displayInfo("Numéro de carte saisi : " + cardNumber); + + // Construction du JSON + ObjectMapper mapper = new ObjectMapper(); + ObjectNode json = mapper.createObjectNode(); + json.put("expirationDate", expirationDate); + json.put("cardNumber", cardNumber); + String jsonString = mapper.writeValueAsString(json); + + // Signer le JSON + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + char[] password = /* TODO */.toCharArray(); + try (FileInputStream pkFile = new FileInputStream("ma_cle.p12")) { + keyStore.load(pkFile, password); + } catch (CertificateException | NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + PrivateKey privateKey = (PrivateKey) keyStore.getKey(/* TODO */, password); + Signature signature = Signature.getInstance("SHA256withRSA"); + signature.initSign(privateKey); + signature.update(jsonString.getBytes(StandardCharsets.UTF_8)); + byte[] signedBytes = signature.sign(); + + String signatureBase64 = Base64.getEncoder().encodeToString(signedBytes); + + // Construction du JSON final avec la signature + ObjectNode finalJson = mapper.createObjectNode(); + finalJson.put("data", jsonString); + finalJson.put("signature", signatureBase64); + + String finalPayload = mapper.writeValueAsString(finalJson); + + // Envoi à l'ACS + Logger.displayInfo("Envoi des informations au service d'authentification sur le port " + Ports.PORT_AUTH + " à l'hôte " + Ports.ACS_HOST); + URL url = new URI("https://" + Ports.ACS_HOST + ":" + Ports.PORT_AUTH).toURL(); + HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); + + con.setRequestMethod("POST"); + con.setRequestProperty("Content-Type", "application/json"); + con.setDoOutput(true); + + try (OutputStream os = con.getOutputStream()) { + os.write(finalPayload.getBytes(StandardCharsets.UTF_8)); + Logger.displaySent("Payload final envoyé : " + finalPayload); + } + + int responseCode = con.getResponseCode(); + Logger.displayReceived("Code de réponse reçu : " + responseCode); } }