From 2b4918105236caf8a497006d9bc769a772099022 Mon Sep 17 00:00:00 2001 From: Bernhard Luedtke Date: Fri, 9 Jul 2021 18:04:48 +0200 Subject: [PATCH] Added JSON Config for MailerConfig loading --- MailClientConfig/defaultMailConfig.json | 9 ++ .../controller/MailController.java | 68 ++++++------ .../klausurenmodul/model/MailerConfig.java | 80 ++++++++++++++ .../klausurenmodul/service/MailService.java | 100 +++++------------- 4 files changed, 148 insertions(+), 109 deletions(-) create mode 100644 MailClientConfig/defaultMailConfig.json create mode 100644 src/main/java/de/fswiai/klausurenmodul/model/MailerConfig.java diff --git a/MailClientConfig/defaultMailConfig.json b/MailClientConfig/defaultMailConfig.json new file mode 100644 index 0000000..f6c3acc --- /dev/null +++ b/MailClientConfig/defaultMailConfig.json @@ -0,0 +1,9 @@ +{ + "configname":"default", + "username":"", + "password":"", + "smtpPort":0, + "smtpHost":"", + "tlsVersion":"TLSv1.2", + "useSTARTTLS":true +} \ No newline at end of file diff --git a/src/main/java/de/fswiai/klausurenmodul/controller/MailController.java b/src/main/java/de/fswiai/klausurenmodul/controller/MailController.java index a9abfde..a4ccd05 100644 --- a/src/main/java/de/fswiai/klausurenmodul/controller/MailController.java +++ b/src/main/java/de/fswiai/klausurenmodul/controller/MailController.java @@ -14,7 +14,7 @@ public class MailController { //DEPRECATED private static final String template = "Hello %s! This is a test mail from the Fachschaft WIAI."; - //TODO controllers should be stateless. This certainly is not. Solve differently. + //TODO controllers should be stateless... idk is this okay?. private final AtomicLong counter = new AtomicLong(); //from the tutorial... deprc @GetMapping("/mail") @@ -32,43 +32,45 @@ public class MailController { @RequestParam(value = "body", defaultValue = "") String body, @RequestParam(value = "mailConfig", defaultValue = "") String mailConfig) { - if(toMail.isEmpty() || fromMail.isEmpty()){ - System.out.println("Abort Mail sending"); - return new Email(-1, "", "", "", ""); - } - Email mail = new Email(counter.incrementAndGet(), toMail, fromMail, body, subject); // TODO add all the exam file stuff via another service, i.e. WatermarkingService // ... - // TODO Mail Validate - if(mail.validateFields()){ - try { - // TODO load the mail config file dep. on the given name in mailConfig and load that config. - MailService mailService = new MailService(); - //For now... - mailService.loadDevelopmentDefault(); - //mailService.loadFromConfig(); - - // Send the mail via the mailService - boolean sendResult = mailService.sendMail(mail); - - //TODO Properly handle return value from sendMail - if(sendResult){ - System.out.println("Mail was sent successfully."); - } - return mail; - } catch (javax.mail.internet.AddressException jMailException) { - System.err.println("Address Exception whilst sending the mail"); - jMailException.printStackTrace(); - return new Email(-1, "", "", "", ""); - } catch (javax.mail.MessagingException jMailException) { - System.err.println("Messaging Exception whilst sending the mail"); - jMailException.printStackTrace(); - return new Email(-1, "", "", "", ""); - } - } else { + // TODO Improve Mail Validate + if(!mail.validateFields()){ System.err.println("Mail is not valid."); return new Email(-1, "", "", "", ""); } + + try { + // TODO load the mail config file dep. on the given name in mailConfig and load that config. + MailService mailService = new MailService(); + + // NOTE: FOR OTHER DEVS - CREATE/CONFIGURE THIS FILE ON YOUR LOCAL MACHINE, DONT ADD TO GIT! + boolean loadConfigResult = mailService.loadFromConfig("../kModulDevconfig.json"); + + if(loadConfigResult) { + // Send the mail via the mailService + boolean sendResult = mailService.sendMail(mail); + //TODO Properly handle return value from sendMail + if(sendResult) { + System.out.println("Mail was sent successfully."); + } + return mail; + } + else { + System.err.println("Unable to successfully load the mailer configuration."); + return new Email(-1, "", "", "", ""); + } + + } catch (javax.mail.internet.AddressException jMailException) { + System.err.println("Address Exception whilst sending the mail"); + jMailException.printStackTrace(); + return new Email(-1, "", "", "", ""); + } catch (javax.mail.MessagingException jMailException) { + System.err.println("Messaging Exception whilst sending the mail"); + jMailException.printStackTrace(); + return new Email(-1, "", "", "", ""); + } + } } diff --git a/src/main/java/de/fswiai/klausurenmodul/model/MailerConfig.java b/src/main/java/de/fswiai/klausurenmodul/model/MailerConfig.java new file mode 100644 index 0000000..6fb94aa --- /dev/null +++ b/src/main/java/de/fswiai/klausurenmodul/model/MailerConfig.java @@ -0,0 +1,80 @@ +package de.fswiai.klausurenmodul.model; + +public class MailerConfig { + private String configname = ""; + private String username = ""; + private String password = ""; + private int smtpPort = 0; + private String smtpHost = ""; + private String tlsVersion = "TLSv1.2"; //maybe already use 1.3? + private boolean useSTARTTLS = true; + + public MailerConfig() { + } + + public MailerConfig(String configname, String username, String password, int smtpPort, String smtpHost, String tlsVersion, boolean useSTARTTLS) { + this.configname = configname; + this.username = username; + this.password = password; + this.smtpPort = smtpPort; + this.smtpHost = smtpHost; + this.tlsVersion = tlsVersion; + this.useSTARTTLS = useSTARTTLS; + } + + public String getConfigname() { + return configname; + } + + public void setConfigname(String configname) { + this.configname = configname; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public int getSmtpPort() { + return smtpPort; + } + + public void setSmtpPort(int smtpPort) { + this.smtpPort = smtpPort; + } + + public String getSmtpHost() { + return smtpHost; + } + + public void setSmtpHost(String smtpHost) { + this.smtpHost = smtpHost; + } + + public String getTlsVersion() { + return tlsVersion; + } + + public void setTlsVersion(String tlsVersion) { + this.tlsVersion = tlsVersion; + } + + public boolean getUseSTARTTLS() { + return useSTARTTLS; + } + + public void setUseSTARTTLS(boolean useSTARTTLS) { + this.useSTARTTLS = useSTARTTLS; + } +} diff --git a/src/main/java/de/fswiai/klausurenmodul/service/MailService.java b/src/main/java/de/fswiai/klausurenmodul/service/MailService.java index e2867a8..08b4a52 100644 --- a/src/main/java/de/fswiai/klausurenmodul/service/MailService.java +++ b/src/main/java/de/fswiai/klausurenmodul/service/MailService.java @@ -1,6 +1,7 @@ package de.fswiai.klausurenmodul.service; import de.fswiai.klausurenmodul.model.Email; +import de.fswiai.klausurenmodul.model.MailerConfig; import javax.mail.*; import javax.mail.internet.InternetAddress; @@ -9,41 +10,35 @@ import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.util.List; import java.util.Properties; +import com.fasterxml.jackson.databind.ObjectMapper; public class MailService { - private String username = ""; - private String password = ""; - private int smtpPort = 0; - private String smtpHost = ""; - private String tlsVersion = "TLSv1.2"; //maybe already use 1.3? - private boolean useSTARTTLS = true; + private MailerConfig mailerConfig; public MailService() { + mailerConfig = new MailerConfig(); } public MailService(String username, String password, int smtpPort, String smtpHost, String tlsVersion, boolean useSTARTTLS) { - this.username = username; - this.password = password; - this.smtpPort = smtpPort; - this.smtpHost = smtpHost; - this.tlsVersion = tlsVersion; - this.useSTARTTLS = useSTARTTLS; + this.mailerConfig = new MailerConfig("customConfig",username, password, smtpPort, smtpHost, tlsVersion, useSTARTTLS); } - public void loadFromConfig(String configJSON){ + public boolean loadFromConfig(String configJSONFilePath){ //TODO First Idea for how we handle mail accounts/configurations. // -> Build some parser for a JSON schema (or something else, idc) that will set username, password and so on. - } - - public void loadDevelopmentDefault(){ - this.username = "ex311199c"; - this.password = ""; - this.smtpPort = 587; - this.smtpHost = "exhub.uni-bamberg.de"; - this.tlsVersion = "TLSv1.2"; - this.useSTARTTLS = true; + try { + ObjectMapper mapper = new ObjectMapper(); + System.out.println("Loading Config from: " + configJSONFilePath); + mailerConfig = mapper.readValue(new File(configJSONFilePath),MailerConfig.class); + return true; + } catch (IOException | IllegalArgumentException e) { + System.err.println("Error whilst loading a config for the Mailer."); + e.printStackTrace(); + return false; + } } //TODO switch boolean to some result class @@ -116,66 +111,19 @@ public class MailService { private Session getNewSession(){ Properties prop = new Properties(); prop.put("mail.smtp.auth", true); - prop.put("mail.smtp.starttls.enable", this.useSTARTTLS ? "true" : "false"); - prop.put("mail.smtp.starttls.required", this.useSTARTTLS ? "true" : "false"); - prop.put("mail.smtp.host", this.smtpHost); - prop.put("mail.smtp.port", this.smtpPort); - prop.put("mail.smtp.ssl.protocols", this.tlsVersion); - prop.put("mail.smtp.ssl.trust", this.smtpHost); + prop.put("mail.smtp.starttls.enable", mailerConfig.getUseSTARTTLS() ? "true" : "false"); + prop.put("mail.smtp.starttls.required", mailerConfig.getUseSTARTTLS() ? "true" : "false"); + prop.put("mail.smtp.host", mailerConfig.getSmtpHost()); + prop.put("mail.smtp.port", mailerConfig.getSmtpPort()); + prop.put("mail.smtp.ssl.protocols", mailerConfig.getTlsVersion()); + prop.put("mail.smtp.ssl.trust", mailerConfig.getSmtpHost()); Session session = Session.getInstance(prop, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(MailService.this.username, MailService.this.password); + return new PasswordAuthentication(MailService.this.mailerConfig.getUsername(), MailService.this.mailerConfig.getPassword()); } }); return session; } - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public int getSmtpPort() { - return smtpPort; - } - - public void setSmtpPort(int smtpPort) { - this.smtpPort = smtpPort; - } - - public String getSmtpHost() { - return smtpHost; - } - - public void setSmtpHost(String smtpHost) { - this.smtpHost = smtpHost; - } - - public String getTlsVersion() { - return tlsVersion; - } - - public void setTlsVersion(String tlsVersion) { - this.tlsVersion = tlsVersion; - } - - public boolean isUseSTARTTLS() { - return useSTARTTLS; - } - - public void setUseSTARTTLS(boolean useSTARTTLS) { - this.useSTARTTLS = useSTARTTLS; - } }