1 |
|
package org.europa.together.application; |
2 |
|
|
3 |
|
import jakarta.activation.DataHandler; |
4 |
|
import jakarta.activation.DataSource; |
5 |
|
import jakarta.mail.MessagingException; |
6 |
|
import jakarta.mail.Multipart; |
7 |
|
import jakarta.mail.NoSuchProviderException; |
8 |
|
import jakarta.mail.PasswordAuthentication; |
9 |
|
import jakarta.mail.Session; |
10 |
|
import jakarta.mail.internet.InternetAddress; |
11 |
|
import jakarta.mail.internet.MimeBodyPart; |
12 |
|
import jakarta.mail.internet.MimeMessage; |
13 |
|
import jakarta.mail.internet.MimeMultipart; |
14 |
|
import java.io.IOException; |
15 |
|
import java.util.Date; |
16 |
|
import java.util.HashMap; |
17 |
|
import java.util.List; |
18 |
|
import java.util.Map; |
19 |
|
import java.util.Properties; |
20 |
|
import jakarta.activation.FileDataSource; |
21 |
|
import org.europa.together.business.ConfigurationDAO; |
22 |
|
import org.europa.together.business.CryptoTools; |
23 |
|
import org.europa.together.business.Logger; |
24 |
|
import org.europa.together.business.MailClient; |
25 |
|
import org.europa.together.business.PropertyReader; |
26 |
|
import org.europa.together.domain.ConfigurationDO; |
27 |
|
import org.europa.together.domain.HashAlgorithm; |
28 |
|
import org.europa.together.domain.LogLevel; |
29 |
|
import org.europa.together.domain.Mail; |
30 |
|
import org.europa.together.utils.Constraints; |
31 |
|
import org.europa.together.utils.StringUtils; |
32 |
|
import org.springframework.beans.factory.annotation.Autowired; |
33 |
|
import org.springframework.stereotype.Repository; |
34 |
|
|
35 |
|
|
36 |
|
|
37 |
|
|
38 |
|
@Repository |
|
|
| 98.1% |
Uncovered Elements: 3 (160) |
Complexity: 32 |
Complexity Density: 0.28 |
|
39 |
|
public class JakartaMailClient implements MailClient { |
40 |
|
|
41 |
|
private static final long serialVersionUID = 6L; |
42 |
|
private static final Logger LOGGER = new LogbackLogger(JakartaMailClient.class); |
43 |
|
|
44 |
|
@Autowired |
45 |
|
private ConfigurationDAO configurationDAO; |
46 |
|
@Autowired |
47 |
|
private CryptoTools cryptoTools; |
48 |
|
@Autowired |
49 |
|
private PropertyReader propertyReader; |
50 |
|
|
51 |
|
private Map<String, String> configuration; |
52 |
|
private MimeMessage message; |
53 |
|
private Mail email; |
54 |
|
private int configMaximumMailBulk; |
55 |
|
private long configCountWaitTime; |
56 |
|
|
57 |
|
|
58 |
|
|
59 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (4) |
Complexity: 1 |
Complexity Density: 0.25 |
|
60 |
3 |
public JakartaMailClient() {... |
61 |
3 |
initConfig(); |
62 |
3 |
configMaximumMailBulk = -1; |
63 |
3 |
configCountWaitTime = -1; |
64 |
3 |
LOGGER.log("instance class", LogLevel.INFO); |
65 |
|
} |
66 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
67 |
19 |
@Override... |
68 |
|
public Map<String, String> getDebugActiveConfiguration() { |
69 |
19 |
return Map.copyOf(configuration); |
70 |
|
} |
71 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
72 |
3 |
@Override... |
73 |
|
public void clearConfiguration() { |
74 |
3 |
configuration.clear(); |
75 |
|
} |
76 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (20) |
Complexity: 4 |
Complexity Density: 0.22 |
|
77 |
8 |
@Override... |
78 |
|
public boolean loadConfigurationFromProperties(final String resource) |
79 |
|
throws IOException { |
80 |
8 |
boolean success = true; |
81 |
8 |
initConfig(); |
82 |
8 |
Map<String, String> properties = new HashMap<>(); |
83 |
8 |
try { |
84 |
8 |
propertyReader.appendPropertiesFromClasspath(resource); |
85 |
6 |
properties = propertyReader.getPropertyList(); |
86 |
|
} catch (Exception ex) { |
87 |
2 |
success = false; |
88 |
2 |
LOGGER.catchException(ex); |
89 |
|
} |
90 |
|
|
91 |
8 |
try { |
92 |
8 |
propertyReader.appendPropertiesFromFile(resource); |
93 |
1 |
properties = propertyReader.getPropertyList(); |
94 |
|
} catch (Exception ex) { |
95 |
7 |
success = false; |
96 |
7 |
LOGGER.catchException(ex); |
97 |
|
} |
98 |
|
|
99 |
8 |
if (!properties.isEmpty()) { |
100 |
7 |
configuration.putAll(properties); |
101 |
|
} else { |
102 |
1 |
success = false; |
103 |
1 |
throw new IOException("Could not load " + resource + " from file system or classpath."); |
104 |
|
} |
105 |
7 |
return success; |
106 |
|
} |
107 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (12) |
Complexity: 2 |
Complexity Density: 0.2 |
|
108 |
5 |
@Override... |
109 |
|
public boolean loadConfigurationFromDatabase() { |
110 |
5 |
boolean success = false; |
111 |
5 |
initConfig(); |
112 |
5 |
LOGGER.log("Load all configuration sets of: " + CONFIG_SET |
113 |
|
+ " - Version: " + CONFIG_VERSION |
114 |
|
+ " - Module: " + Constraints.MODULE_NAME, LogLevel.DEBUG); |
115 |
5 |
List<ConfigurationDO> configurationEntries |
116 |
|
= configurationDAO.getAllConfigurationSetEntries(Constraints.MODULE_NAME, |
117 |
|
CONFIG_VERSION, CONFIG_SET); |
118 |
5 |
LOGGER.log("Size of config SET: " + configurationEntries.size(), LogLevel.DEBUG); |
119 |
5 |
if (configurationEntries.size() > 0) { |
120 |
4 |
processConfiguration(configurationEntries); |
121 |
4 |
success = true; |
122 |
|
} |
123 |
5 |
LOGGER.log("DB CONFIG: " + configuration, LogLevel.DEBUG); |
124 |
5 |
return success; |
125 |
|
} |
126 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
127 |
1 |
@Override... |
128 |
|
public int getBulkMailLimiter() { |
129 |
1 |
return this.configMaximumMailBulk; |
130 |
|
} |
131 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
132 |
1 |
@Override... |
133 |
|
public long getWaitTime() { |
134 |
1 |
return this.configCountWaitTime; |
135 |
|
} |
136 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (28) |
Complexity: 3 |
Complexity Density: 0.12 |
|
137 |
4 |
@Override... |
138 |
|
public void composeMail(final Mail email) |
139 |
|
throws MessagingException { |
140 |
4 |
MimeMessage mimeMessage = null; |
141 |
4 |
LOGGER.log("Compose E-Mail", LogLevel.DEBUG); |
142 |
4 |
mimeMessage = new MimeMessage(getSession()); |
143 |
|
|
144 |
4 |
mimeMessage.setHeader("From: ", configuration.get("mailer.sender")); |
145 |
4 |
mimeMessage.setHeader("Return-Path: ", configuration.get("mailer.sender")); |
146 |
4 |
mimeMessage.setSentDate(new Date()); |
147 |
4 |
mimeMessage.setSubject(email.getSubject()); |
148 |
4 |
mimeMessage.setFrom(new InternetAddress(configuration.get("mailer.sender"))); |
149 |
4 |
mimeMessage.setSender(new InternetAddress(configuration.get("mailer.sender"))); |
150 |
|
|
151 |
4 |
MimeBodyPart bodypart = new MimeBodyPart(); |
152 |
4 |
if (email.getMimeType().equals("html")) { |
153 |
1 |
bodypart.setContent(email.getMessage(), "text/html; charset=utf-8"); |
154 |
|
} else { |
155 |
3 |
bodypart.setText(email.getMessage(), "utf-8"); |
156 |
|
} |
157 |
|
|
158 |
4 |
Multipart multipart = new MimeMultipart(); |
159 |
4 |
multipart.addBodyPart(bodypart); |
160 |
4 |
if (!email.getAttachmentList().isEmpty()) { |
161 |
2 |
for (FileDataSource file : email.getAttachmentList()) { |
162 |
2 |
DataSource source = file; |
163 |
2 |
bodypart.setDataHandler(new DataHandler(source)); |
164 |
2 |
bodypart.setFileName(file.getName()); |
165 |
2 |
multipart.addBodyPart(bodypart); |
166 |
|
} |
167 |
|
} |
168 |
4 |
mimeMessage.setContent(multipart); |
169 |
4 |
this.message = mimeMessage; |
170 |
4 |
this.email = email; |
171 |
|
} |
172 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (3) |
Complexity: 1 |
Complexity Density: 0.33 |
|
173 |
6 |
@Override... |
174 |
|
public Session getSession() |
175 |
|
throws NoSuchProviderException { |
176 |
6 |
Session connection = Session.getInstance(wireConfigurationEntries(), |
177 |
|
new jakarta.mail.Authenticator() { |
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
178 |
0 |
@Override... |
179 |
|
protected PasswordAuthentication getPasswordAuthentication() { |
180 |
0 |
return new PasswordAuthentication( |
181 |
|
configuration.get("mailer.user"), |
182 |
|
configuration.get("mailer.password") |
183 |
|
); |
184 |
|
} |
185 |
|
}); |
186 |
5 |
connection.setDebug(Boolean.valueOf(configuration.get("mailer.debug"))); |
187 |
5 |
return connection; |
188 |
|
} |
189 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
190 |
1 |
@Override... |
191 |
|
public Mail getMailObject() { |
192 |
1 |
return email; |
193 |
|
} |
194 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
195 |
3 |
@Override... |
196 |
|
public MimeMessage getMimeMessage() { |
197 |
3 |
return message; |
198 |
|
} |
199 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (11) |
Complexity: 1 |
Complexity Density: 0.09 |
|
200 |
16 |
private void initConfig() {... |
201 |
16 |
this.configuration = new HashMap<>(); |
202 |
16 |
configuration.put("mailer.host", "mailer.host"); |
203 |
16 |
configuration.put("mailer.port", "mailer.port"); |
204 |
16 |
configuration.put("mailer.sender", "mailer.sender"); |
205 |
16 |
configuration.put("mailer.user", "mailer.user"); |
206 |
16 |
configuration.put("mailer.password", "mailer.password"); |
207 |
16 |
configuration.put("mailer.ssl", "mailer.ssl"); |
208 |
16 |
configuration.put("mailer.tls", "mailer.tls"); |
209 |
16 |
configuration.put("mailer.debug", "false"); |
210 |
16 |
configuration.put("mailer.count", "-1"); |
211 |
16 |
configuration.put("mailer.wait", "-1"); |
212 |
|
} |
213 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (12) |
Complexity: 1 |
Complexity Density: 0.08 |
|
214 |
6 |
private Properties wireConfigurationEntries() {... |
215 |
6 |
configCountWaitTime = Long.parseLong(configuration.get("mailer.wait")); |
216 |
5 |
configMaximumMailBulk = Integer.parseInt(configuration.get("mailer.count")); |
217 |
5 |
Properties props = new Properties(); |
218 |
5 |
props.put("mail.smtp.host", configuration.get("mailer.host")); |
219 |
5 |
props.put("mail.smtp.port", configuration.get("mailer.port")); |
220 |
5 |
props.put("mail.smtp.auth", "true"); |
221 |
5 |
props.put("mail.smtp.starttls.enable", configuration.get("mailer.tls")); |
222 |
5 |
props.put("mail.smtp.ssl.enable", configuration.get("mailer.ssl")); |
223 |
5 |
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); |
224 |
5 |
props.put("mail.smtp.socketFactory.port", configuration.get("mailer.port")); |
225 |
5 |
props.put("mail.smtp.socketFactory.fallback", "false"); |
226 |
5 |
return props; |
227 |
|
} |
228 |
|
|
|
|
| 97.9% |
Uncovered Elements: 1 (48) |
Complexity: 12 |
Complexity Density: 0.46 |
|
229 |
4 |
private void processConfiguration(final List<ConfigurationDO> configurationEntries) {... |
230 |
4 |
LOGGER.log("Process E-Mail Configuration (" + configurationEntries.size() + ")", |
231 |
|
LogLevel.DEBUG); |
232 |
4 |
for (ConfigurationDO entry : configurationEntries) { |
233 |
40 |
String value; |
234 |
40 |
if (StringUtils.isEmpty(entry.getValue())) { |
235 |
35 |
value = entry.getDefaultValue(); |
236 |
|
} else { |
237 |
5 |
value = entry.getValue(); |
238 |
|
} |
239 |
40 |
if (entry.getKey() |
240 |
|
.equals(cryptoTools.calculateHash("mailer.host", |
241 |
|
HashAlgorithm.SHA256))) { |
242 |
4 |
configuration.replace("mailer.host", value); |
243 |
36 |
} else if (entry.getKey() |
244 |
|
.equals(cryptoTools.calculateHash("mailer.port", |
245 |
|
HashAlgorithm.SHA256))) { |
246 |
4 |
configuration.replace("mailer.port", value); |
247 |
32 |
} else if (entry.getKey() |
248 |
|
.equals(cryptoTools.calculateHash("mailer.sender", |
249 |
|
HashAlgorithm.SHA256))) { |
250 |
4 |
configuration.replace("mailer.sender", value); |
251 |
28 |
} else if (entry.getKey() |
252 |
|
.equals(cryptoTools.calculateHash("mailer.user", |
253 |
|
HashAlgorithm.SHA256))) { |
254 |
4 |
configuration.replace("mailer.user", value); |
255 |
24 |
} else if (entry.getKey() |
256 |
|
.equals(cryptoTools.calculateHash("mailer.password", |
257 |
|
HashAlgorithm.SHA256))) { |
258 |
4 |
configuration.replace("mailer.password", value); |
259 |
20 |
} else if (entry.getKey() |
260 |
|
.equals(cryptoTools.calculateHash("mailer.ssl", |
261 |
|
HashAlgorithm.SHA256))) { |
262 |
4 |
configuration.replace("mailer.ssl", value); |
263 |
16 |
} else if (entry.getKey() |
264 |
|
.equals(cryptoTools.calculateHash("mailer.tls", |
265 |
|
HashAlgorithm.SHA256))) { |
266 |
4 |
configuration.replace("mailer.tls", value); |
267 |
12 |
} else if (entry.getKey() |
268 |
|
.equals(cryptoTools.calculateHash("mailer.debug", |
269 |
|
HashAlgorithm.SHA256))) { |
270 |
4 |
configuration.replace("mailer.debug", value); |
271 |
8 |
} else if (entry.getKey() |
272 |
|
.equals(cryptoTools.calculateHash("mailer.count", |
273 |
|
HashAlgorithm.SHA256))) { |
274 |
4 |
configuration.replace("mailer.count", value); |
275 |
4 |
} else if (entry.getKey() |
276 |
|
.equals(cryptoTools.calculateHash("mailer.wait", |
277 |
|
HashAlgorithm.SHA256))) { |
278 |
4 |
configuration.replace("mailer.wait", value); |
279 |
|
} |
280 |
|
} |
281 |
|
} |
282 |
|
} |