Skip to content

Commit c979429

Browse files
committed
0.17.2: - betriebsmodus "KONNEKTOR" -> über den konnektor verschlüsselte und signierte mail kann an einen normalen mailserver gesendet werden, NUR für den Test angedacht
1 parent 2ac1901 commit c979429

11 files changed

+145
-25
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
</parent>
1111
<groupId>net.sberg</groupId>
1212
<artifactId>openkim</artifactId>
13-
<version>0.17.1</version>
13+
<version>0.17.2</version>
1414
<name>openkim</name>
1515
<description>Open KIM Client Modul</description>
1616

src/main/java/net/sberg/openkim/gateway/pop3/cmdhandler/Pop3GatewayRetrCmdHandler.java

+12-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import net.sberg.openkim.pipeline.operation.mail.CreateDsnOperation;
2929
import net.sberg.openkim.pipeline.operation.mail.CreateEmbeddedMessageRfc822Operation;
3030
import net.sberg.openkim.pipeline.operation.mail.DecryptVerifyMailOperation;
31+
import net.sberg.openkim.pipeline.operation.mail.MailUtils;
3132
import net.sberg.openkim.pipeline.operation.mail.kas.KasIncomingMailOperation;
3233
import org.apache.james.protocols.api.Request;
3334
import org.apache.james.protocols.api.Response;
@@ -110,6 +111,11 @@ private Response doRetr(POP3Session session, Request request) {
110111
if (session.getHandlerState() == POP3Session.TRANSACTION) {
111112
try {
112113
MimeMessage message = (MimeMessage) pop3GatewaySession.getPop3ClientFolder().getMessage(Integer.parseInt(request.getArgument()));
114+
115+
if (!MailUtils.checkAddressMapping(logger, message, false)) {
116+
throw new IllegalStateException("error on checking of address mapping");
117+
}
118+
113119
pop3GatewaySession.setGatewayState(EnumPop3GatewayState.PROCESS);
114120

115121
byte[] pop3msg = null;
@@ -144,7 +150,12 @@ private Response doRetr(POP3Session session, Request request) {
144150
message = (MimeMessage) defaultPipelineOperationContext.getEnvironmentValue(KasIncomingMailOperation.NAME, KasIncomingMailOperation.ENV_RESULT_MSG);
145151
}
146152

147-
pop3msg = decryptVerify(pop3GatewaySession.getLogger(), pop3GatewaySession.getLogger().getDefaultLoggerContext().getMailServerUsername(), message);
153+
String userMailAddress = pop3GatewaySession.getLogger().getDefaultLoggerContext().getMailServerUsername();
154+
if (!logger.getDefaultLoggerContext().getKonfiguration().getGatewayTIMode().equals(EnumGatewayTIMode.FULLSTACK) && logger.getDefaultLoggerContext().getSenderAddressMapping().containsKey(userMailAddress)) {
155+
userMailAddress = logger.getDefaultLoggerContext().getSenderAddressMapping().get(userMailAddress);
156+
}
157+
158+
pop3msg = decryptVerify(pop3GatewaySession.getLogger(), userMailAddress, message);
148159
if (!logger.getDefaultLoggerContext().getMailSignVerifyErrorContext().isEmpty()) {
149160

150161
CreateDsnOperation createDsnOperation = (CreateDsnOperation) pipelineService.getOperation(CreateDsnOperation.BUILTIN_VENDOR + "." + CreateDsnOperation.NAME);

src/main/java/net/sberg/openkim/gateway/smtp/cmdhandler/SmtpGatewayRcptCmdHandler.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,9 @@ protected Response doCoreCmd(SMTPSession session, String command, String paramet
9898
}
9999
else {
100100
DefaultLoggerContext loggerContext = ((SmtpGatewaySession) session).getLogger().getDefaultLoggerContext();
101-
if (!loggerContext.getRecipientAddresses().contains(recipientAddress.asString().toLowerCase())) {
101+
if (!loggerContext.getRecipientAddresses(true).contains(recipientAddress.asString().toLowerCase())) {
102102
((SmtpGatewaySession) session).log("rcpt to: "+recipientAddress.asString().toLowerCase());
103-
loggerContext.getRecipientAddresses().add(recipientAddress.asString().toLowerCase());
103+
loggerContext.getRecipientAddresses(true).add(recipientAddress.asString().toLowerCase());
104104
}
105105
}
106106
} catch (Exception e) {

src/main/java/net/sberg/openkim/gateway/smtp/hook/SmtpGatewayMailHook.java

+9-5
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import net.sberg.openkim.pipeline.operation.DefaultPipelineOperationContext;
3232
import net.sberg.openkim.pipeline.operation.konnektor.vzd.LoadVzdCertsOperation;
3333
import net.sberg.openkim.pipeline.operation.mail.CheckSendingMailOperation;
34+
import net.sberg.openkim.pipeline.operation.mail.MailUtils;
3435
import net.sberg.openkim.pipeline.operation.mail.SendDsnOperation;
3536
import net.sberg.openkim.pipeline.operation.mail.SignEncryptMailOperation;
3637
import net.sberg.openkim.pipeline.operation.mail.kas.KasOutgoingMailOperation;
@@ -191,30 +192,33 @@ public HookResult onMessage(SMTPSession session, MailEnvelope mailEnvelope) {
191192

192193
File tempMailFile = FileUtils.writeToFileDirectory((ByteArrayOutputStream) mailEnvelope.getMessageOutputStream(), "openkim", System.getProperty("java.io.tmpdir"));
193194
MimeMessage message = new MimeMessage(Session.getInstance(new Properties()), new FileInputStream(tempMailFile));
195+
if (!MailUtils.checkAddressMapping(logger, message, true)) {
196+
throw new IllegalStateException("error on checking of address mapping");
197+
}
194198
tempMailFile.delete();
195199

196200
String msgContent = null;
197201
List<IErrorContext> errorContexts = new ArrayList();
198202
if (!logger.getDefaultLoggerContext().getKonfiguration().getGatewayTIMode().equals(EnumGatewayTIMode.NO_TI)) {
199203

200204
//check sender
201-
List<String> senderAddresses = List.of(logger.getDefaultLoggerContext().getSenderAddress());
205+
List<String> senderAddresses = List.of(logger.getDefaultLoggerContext().getSenderAddress(false));
202206
if (!checkMailAddresses(smtpGatewaySession, logger.getDefaultLoggerContext().getSenderCerts(), senderAddresses, true, false)) {
203207
smtpGatewaySession.getSmtpClient().rset();
204208
smtpGatewaySession.log("mail hook ends - error");
205209
return HookResult.DENY;
206210
}
207-
if (logger.getDefaultLoggerContext().getMailaddressCertErrorContext().isError(logger.getDefaultLoggerContext().getSenderAddress())) {
211+
if (logger.getDefaultLoggerContext().getMailaddressCertErrorContext().isError(logger.getDefaultLoggerContext().getSenderAddress(false))) {
208212
smtpGatewaySession.getSmtpClient().rset();
209213
return sendDsn(logger, List.of(logger.getDefaultLoggerContext().getMailaddressCertErrorContext()), message, true);
210214
}
211-
if (logger.getDefaultLoggerContext().getMailaddressKimVersionErrorContext().isError(logger.getDefaultLoggerContext().getSenderAddress())) {
215+
if (logger.getDefaultLoggerContext().getMailaddressKimVersionErrorContext().isError(logger.getDefaultLoggerContext().getSenderAddress(false))) {
212216
smtpGatewaySession.getSmtpClient().rset();
213217
return sendDsn(logger, List.of(logger.getDefaultLoggerContext().getMailaddressKimVersionErrorContext()), message, true);
214218
}
215219

216220
//check recipients
217-
if (!checkMailAddresses(smtpGatewaySession, logger.getDefaultLoggerContext().getRecipientCerts(), logger.getDefaultLoggerContext().getRecipientAddresses(), false, true)) {
221+
if (!checkMailAddresses(smtpGatewaySession, logger.getDefaultLoggerContext().getRecipientCerts(), logger.getDefaultLoggerContext().getRecipientAddresses(false), false, true)) {
218222
smtpGatewaySession.getSmtpClient().rset();
219223
smtpGatewaySession.log("mail hook ends - error");
220224
return HookResult.DENY;
@@ -343,7 +347,7 @@ public HookResult onMessage(SMTPSession session, MailEnvelope mailEnvelope) {
343347
else {
344348
//send rcpt to
345349
boolean successfulRcptTo = false;
346-
for (Iterator<String> iterator = logger.getDefaultLoggerContext().getRecipientAddresses().iterator(); iterator.hasNext(); ) {
350+
for (Iterator<String> iterator = logger.getDefaultLoggerContext().getRecipientAddresses(true).iterator(); iterator.hasNext(); ) {
347351
String rcptAddress = iterator.next();
348352
int res = ((SmtpGatewaySession) session).getSmtpClient().rcpt("<" + rcptAddress + ">");
349353
if (!SMTPReply.isPositiveCompletion(res)) {

src/main/java/net/sberg/openkim/log/DefaultLoggerContext.java

+31-5
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818

1919
import net.sberg.openkim.common.x509.X509CertificateResult;
2020
import net.sberg.openkim.fachdienst.Fachdienst;
21+
import net.sberg.openkim.konfiguration.EnumGatewayTIMode;
2122
import net.sberg.openkim.konfiguration.Konfiguration;
2223
import net.sberg.openkim.konnektor.Konnektor;
2324
import net.sberg.openkim.log.error.*;
2425

2526
import java.util.*;
27+
import java.util.stream.Collectors;
2628

2729
public class DefaultLoggerContext {
2830

@@ -47,10 +49,14 @@ public class DefaultLoggerContext {
4749
private String mailServerUsername;
4850
private String mailServerPassword;
4951
private de.gematik.kim.al.model.AccountLimit accountLimit = new de.gematik.kim.al.model.AccountLimit();
52+
5053
private String senderAddress;
5154
private Map<String, X509CertificateResult> senderCerts = new HashMap<>();
55+
private Map<String, String> senderAddressMapping = new HashMap<>();
56+
5257
private List<String> recipientAddresses = new ArrayList<>();
5358
private Map<String, X509CertificateResult> recipientCerts = new HashMap<>();
59+
private Map<String, Map<String, String>> recipientAddressMapping = new HashMap<>();
5460

5561
private final MailaddressCertErrorContext mailaddressCertErrorContext = new MailaddressCertErrorContext();
5662
private final MailaddressKimVersionErrorContext mailaddressKimVersionErrorContext = new MailaddressKimVersionErrorContext();
@@ -252,15 +258,35 @@ public String getMailServerPassword() {
252258
return mailServerPassword;
253259
}
254260

255-
public List<String> getRecipientAddresses() { return recipientAddresses; }
256-
261+
public List<String> getRecipientAddresses(boolean origin) {
262+
if (konfiguration.getGatewayTIMode().equals(EnumGatewayTIMode.FULLSTACK)) {
263+
return recipientAddresses;
264+
}
265+
if (origin) {
266+
return recipientAddresses;
267+
}
268+
if (getRecipientAddressMapping().isEmpty()) {
269+
return recipientAddresses;
270+
}
271+
return getRecipientAddressMapping().values().stream().map(stringStringMap -> stringStringMap.values()).flatMap(Collection::stream).collect(Collectors.toList());
272+
}
257273
public Map<String, X509CertificateResult> getRecipientCerts() { return recipientCerts; }
274+
public Map<String, Map<String, String>> getRecipientAddressMapping() { return recipientAddressMapping; }
258275

259-
public String getSenderAddress() {
260-
return senderAddress;
276+
public String getSenderAddress(boolean origin) {
277+
if (konfiguration.getGatewayTIMode().equals(EnumGatewayTIMode.FULLSTACK)) {
278+
return senderAddress;
279+
}
280+
if (origin) {
281+
return senderAddress;
282+
}
283+
if (getSenderAddressMapping().isEmpty()) {
284+
return senderAddress;
285+
}
286+
return getSenderAddressMapping().get(senderAddress);
261287
}
262-
263288
public Map<String, X509CertificateResult> getSenderCerts() { return senderCerts; }
289+
public Map<String, String> getSenderAddressMapping() { return senderAddressMapping; }
264290

265291
public de.gematik.kim.al.model.AccountLimit getAccountLimit() {
266292
return accountLimit;

src/main/java/net/sberg/openkim/pipeline/operation/mail/CheckSendingMailOperation.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public void execute(DefaultPipelineOperationContext defaultPipelineOperationCont
7272

7373
MimeMessage message = (MimeMessage) defaultPipelineOperationContext.getEnvironmentValue(NAME, ENV_MSG);
7474
List<X509CertificateResult> recipientCerts = new ArrayList<>(logger.getDefaultLoggerContext().getRecipientCerts().values());
75-
String senderAddress = logger.getDefaultLoggerContext().getSenderAddress();
75+
String senderAddress = logger.getDefaultLoggerContext().getSenderAddress(false);
7676

7777
if (message.getFrom() == null || message.getFrom().length == 0) {
7878
logger.logLine("no from header available for senderAddress: " + senderAddress);

src/main/java/net/sberg/openkim/pipeline/operation/mail/ComposeEncryptedMailOperation.java

+8
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,14 @@ public void execute(DefaultPipelineOperationContext defaultPipelineOperationCont
135135
resultMsg.addHeader(MailUtils.X_OPENKIM_TEST_ID, openkimTestId);
136136
}
137137

138+
//check on openkim test message -> addressmapping
139+
String addressMapping = (originMimeMessage.getHeader(MailUtils.X_OPENKIM_ADDRESS_MAPPING) != null && originMimeMessage.getHeader(MailUtils.X_OPENKIM_ADDRESS_MAPPING).length > 0)
140+
? originMimeMessage.getHeader(MailUtils.X_OPENKIM_ADDRESS_MAPPING)[0]
141+
: null;
142+
if (addressMapping != null) {
143+
resultMsg.addHeader(MailUtils.X_OPENKIM_ADDRESS_MAPPING, addressMapping);
144+
}
145+
138146
resultMsg.addHeader(MailUtils.X_KIM_DIENSTKENNUNG, dienstkennung);
139147
resultMsg = MailUtils.setRecipients(logger, recipientCerts, originMimeMessage, resultMsg, Message.RecipientType.TO);
140148
resultMsg = MailUtils.setRecipients(logger, recipientCerts, originMimeMessage, resultMsg, Message.RecipientType.CC);

src/main/java/net/sberg/openkim/pipeline/operation/mail/MailUtils.java

+72-1
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,77 @@ public static final MimeMessage setRecipients(
138138
return resultMessage;
139139
}
140140

141+
public static final boolean checkAddressMapping(DefaultLogger logger, MimeMessage msg, boolean sendingMode) throws Exception {
142+
try {
143+
logger.logLine("checkAddressMapping");
144+
String addressMappingStr = (msg.getHeader(MailUtils.X_OPENKIM_ADDRESS_MAPPING) != null && msg.getHeader(MailUtils.X_OPENKIM_ADDRESS_MAPPING).length > 0)
145+
? msg.getHeader(MailUtils.X_OPENKIM_ADDRESS_MAPPING)[0]
146+
: null;
147+
if (addressMappingStr == null) {
148+
logger.logLine("checkAddressMapping finished - no mappings available");
149+
return true;
150+
}
151+
//to|kim-test@sberg.net=uschi@web.de,from|basketmc@gmail.com=uschi@yahoo.de
152+
String[] mappings = addressMappingStr.split(",");
153+
for (int i = 0; i < mappings.length; i++) {
154+
String recOrSender = mappings[i].split("\\|")[0].toLowerCase();
155+
String mapping = mappings[i].split("\\|")[1];
156+
String source = mapping.split("=")[0].toLowerCase();
157+
String target = mapping.split("=")[1].toLowerCase();
158+
if (!recOrSender.equals(FROM.toLowerCase())
159+
&&
160+
!recOrSender.equals(TO.toLowerCase())
161+
&&
162+
!recOrSender.equals(CC.toLowerCase())
163+
&&
164+
!recOrSender.equals(BCC.toLowerCase())
165+
) {
166+
throw new IllegalStateException("falsches Format");
167+
}
168+
169+
if (recOrSender.equals(FROM.toLowerCase())) {
170+
logger.getDefaultLoggerContext().getSenderAddressMapping().put(source, target);
171+
}
172+
else {
173+
if (!logger.getDefaultLoggerContext().getRecipientAddressMapping().containsKey(recOrSender)) {
174+
logger.getDefaultLoggerContext().getRecipientAddressMapping().put(recOrSender, new HashMap<>());
175+
}
176+
logger.getDefaultLoggerContext().getRecipientAddressMapping().get(recOrSender).put(source, target);
177+
}
178+
}
179+
180+
if (sendingMode) {
181+
String from = msg.getFrom()[0].toString().toLowerCase();
182+
if (logger.getDefaultLoggerContext().getSenderAddressMapping().containsKey(from)) {
183+
msg.setFrom(logger.getDefaultLoggerContext().getSenderAddressMapping().get(from));
184+
}
185+
186+
List<Message.RecipientType> types = List.of(Message.RecipientType.TO, Message.RecipientType.CC, Message.RecipientType.BCC);
187+
for (Iterator<Message.RecipientType> iterator = types.iterator(); iterator.hasNext(); ) {
188+
Message.RecipientType type = iterator.next();
189+
Address[] addresses = msg.getRecipients(type);
190+
if (addresses != null && logger.getDefaultLoggerContext().getRecipientAddressMapping().containsKey(type.toString().toLowerCase())) {
191+
msg.removeHeader(type.toString().toLowerCase());
192+
for (int i = 0; i < addresses.length; i++) {
193+
if (logger.getDefaultLoggerContext().getRecipientAddressMapping().get(type.toString().toLowerCase()).containsKey(addresses[i].toString().toLowerCase())) {
194+
msg.addRecipient(type, new InternetAddress(logger.getDefaultLoggerContext().getRecipientAddressMapping().get(type.toString().toLowerCase()).get(addresses[i].toString().toLowerCase())));
195+
} else {
196+
msg.addRecipient(type, addresses[i]);
197+
}
198+
}
199+
}
200+
}
201+
}
202+
203+
return true;
204+
}
205+
catch (Exception e) {
206+
log.error("error on checkAddressMapping", e);
207+
logger.logLine("error on checkAddressMapping");
208+
throw e;
209+
}
210+
}
211+
141212
public static final boolean checkHeader(DefaultLogger logger, Konnektor konnektor, MimeMessage encryptedMsg, MimeMessage decryptedAndVerifiedMsg, String headerName) throws Exception {
142213
try {
143214
logger.logLine("check header: " + headerName);
@@ -298,7 +369,7 @@ public static final Session createPop3ClientSession(
298369
authMethod,
299370
host,
300371
port,
301-
pop3ClientIdleTimeoutInSeconds * 1000
372+
pop3ClientIdleTimeoutInSeconds * 1000
302373
);
303374

304375
if (createSSLSocketFactory) {

src/main/java/net/sberg/openkim/pipeline/operation/mail/SendDsnOperation.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ else if (errorContext instanceof MailaddressKimVersionErrorContext) {
177177

178178
mimeMessage = DsnHelper.createMessage(
179179
originMessage,
180-
logger.getDefaultLoggerContext().getSenderAddress(),
180+
logger.getDefaultLoggerContext().getSenderAddress(false),
181181
contentBuilder.toString(),
182182
"",
183183
"",
@@ -212,8 +212,8 @@ else if (errorContext instanceof MailaddressKimVersionErrorContext) {
212212
logger.logLine("dsn sending - smtp auth: " + res);
213213
if (res) {
214214
String content = byteArrayOutputStream.toString();
215-
String[] recs = new String[]{logger.getDefaultLoggerContext().getSenderAddress()};
216-
res = client.sendSimpleMessage(logger.getDefaultLoggerContext().getSenderAddress(), recs, content);
215+
String[] recs = new String[]{logger.getDefaultLoggerContext().getSenderAddress(false)};
216+
res = client.sendSimpleMessage(logger.getDefaultLoggerContext().getSenderAddress(false), recs, content);
217217
logger.logLine("dsn sending - smtp sent: " + res);
218218
}
219219

0 commit comments

Comments
 (0)