Limit environments allowed to send emails out (#1807)

This commit is contained in:
Pavlo Tkach 2022-10-07 12:12:57 -04:00 committed by GitHub
parent b83c970af4
commit a64d086708

View file

@ -14,8 +14,12 @@
package google.registry.util; package google.registry.util;
import static com.google.common.collect.ImmutableSet.toImmutableSet;
import static com.google.common.collect.Iterables.toArray; import static com.google.common.collect.Iterables.toArray;
import com.google.common.base.Ascii;
import com.google.common.collect.ImmutableSet;
import com.google.common.flogger.FluentLogger;
import com.google.common.net.MediaType; import com.google.common.net.MediaType;
import google.registry.util.EmailMessage.Attachment; import google.registry.util.EmailMessage.Attachment;
import java.io.IOException; import java.io.IOException;
@ -44,6 +48,10 @@ public class SendEmailService {
private final Retrier retrier; private final Retrier retrier;
private final TransportEmailSender transportEmailSender; private final TransportEmailSender transportEmailSender;
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private static final ImmutableSet<String> ALLOWED_ENVS =
ImmutableSet.of("PRODUCTION", "UNITTEST");
@Inject @Inject
SendEmailService(Retrier retrier, TransportEmailSender transportEmailSender) { SendEmailService(Retrier retrier, TransportEmailSender transportEmailSender) {
this.retrier = retrier; this.retrier = retrier;
@ -55,37 +63,50 @@ public class SendEmailService {
* on transient failures. * on transient failures.
*/ */
public void sendEmail(EmailMessage emailMessage) { public void sendEmail(EmailMessage emailMessage) {
retrier.callWithRetry( if (!ALLOWED_ENVS.contains(
() -> { Ascii.toUpperCase(System.getProperty("google.registry.environment", "UNITTEST")))) {
Message msg = logger.atInfo().log(
new MimeMessage( String.format(
Session.getDefaultInstance(new Properties(), /* authenticator= */ null)); "Email with subject %s would have been sent to recipients %s",
msg.setFrom(emailMessage.from()); emailMessage.subject().substring(0, Math.min(emailMessage.subject().length(), 15)),
msg.addRecipients( String.join(
RecipientType.TO, toArray(emailMessage.recipients(), InternetAddress.class)); " , ",
msg.setSubject(emailMessage.subject()); emailMessage.recipients().stream()
.map(ia -> ia.toString())
.collect(toImmutableSet()))));
} else {
retrier.callWithRetry(
() -> {
Message msg =
new MimeMessage(
Session.getDefaultInstance(new Properties(), /* authenticator= */ null));
msg.setFrom(emailMessage.from());
msg.addRecipients(
RecipientType.TO, toArray(emailMessage.recipients(), InternetAddress.class));
msg.setSubject(emailMessage.subject());
Multipart multipart = new MimeMultipart(); Multipart multipart = new MimeMultipart();
BodyPart bodyPart = new MimeBodyPart(); BodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent( bodyPart.setContent(
emailMessage.body(), emailMessage.body(),
emailMessage.contentType().orElse(MediaType.PLAIN_TEXT_UTF_8).toString()); emailMessage.contentType().orElse(MediaType.PLAIN_TEXT_UTF_8).toString());
multipart.addBodyPart(bodyPart); multipart.addBodyPart(bodyPart);
if (emailMessage.attachment().isPresent()) { if (emailMessage.attachment().isPresent()) {
Attachment attachment = emailMessage.attachment().get(); Attachment attachment = emailMessage.attachment().get();
BodyPart attachmentPart = new MimeBodyPart(); BodyPart attachmentPart = new MimeBodyPart();
attachmentPart.setContent(attachment.content(), attachment.contentType().toString()); attachmentPart.setContent(attachment.content(), attachment.contentType().toString());
attachmentPart.setFileName(attachment.filename()); attachmentPart.setFileName(attachment.filename());
multipart.addBodyPart(attachmentPart); multipart.addBodyPart(attachmentPart);
} }
msg.addRecipients(RecipientType.BCC, toArray(emailMessage.bccs(), Address.class)); msg.addRecipients(RecipientType.BCC, toArray(emailMessage.bccs(), Address.class));
msg.addRecipients(RecipientType.CC, toArray(emailMessage.ccs(), Address.class)); msg.addRecipients(RecipientType.CC, toArray(emailMessage.ccs(), Address.class));
msg.setContent(multipart); msg.setContent(multipart);
msg.saveChanges(); msg.saveChanges();
transportEmailSender.sendMessage(msg); transportEmailSender.sendMessage(msg);
}, },
IOException.class, IOException.class,
MessagingException.class); MessagingException.class);
}
} }
} }