X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2Forg%2Fcacert%2Fgigi%2Femail%2FEmailProvider.java;h=d82725d1783ebf5e971a7fc6a5e3aba23d845f3e;hb=ed391f95fa080212a1bec06afd0e0fd0dbb213bb;hp=b66ba3f9aa71bcc88f7b1b6247a55063d3070d05;hpb=aa5723dbb64ec8efa63909d39ff72364f0a5ee96;p=gigi.git diff --git a/src/org/cacert/gigi/email/EmailProvider.java b/src/org/cacert/gigi/email/EmailProvider.java index b66ba3f9..d82725d1 100644 --- a/src/org/cacert/gigi/email/EmailProvider.java +++ b/src/org/cacert/gigi/email/EmailProvider.java @@ -22,10 +22,11 @@ import javax.net.ssl.SSLSocketFactory; import org.cacert.gigi.crypto.SMIME; import org.cacert.gigi.database.GigiPreparedStatement; import org.cacert.gigi.util.DNSUtil; +import org.cacert.gigi.util.DomainAssessment; public abstract class EmailProvider { - public abstract void sendmail(String to, String subject, String message, String from, String replyto, String toname, String fromname, String errorsto, boolean extra) throws IOException; + public abstract void sendMail(String to, String subject, String message, String replyto, String toname, String fromname, String errorsto, boolean extra) throws IOException; private static EmailProvider instance; @@ -40,8 +41,7 @@ public abstract class EmailProvider { protected final void sendSigned(String contents, PrintWriter output) throws IOException, GeneralSecurityException { if (k == null || c == null) { - output.println("Content-Transfer-Encoding: base64"); - output.println(); + output.print("Content-Transfer-Encoding: base64\r\n\r\n"); output.print(contents); } else { SMIME.smime(contents, k, c, output); @@ -71,10 +71,20 @@ public abstract class EmailProvider { public static final String FAIL = "FAIL"; - public static final Pattern MAIL = Pattern.compile("^([a-zA-Z0-9])+([a-zA-Z0-9\\+\\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\\._-]+)+$"); + private static final String MAIL_P_RFC_WORD = "[A-Za-z0-9\\+\\.!#$%&'*/=?^_`|~{}-]+"; + + private static final String MAIL_P_RFC_LOCAL = MAIL_P_RFC_WORD + "(?:\\." + MAIL_P_RFC_WORD + ")*"; + + private static final String MAIL_P_RFC_LABEL = "(?!(?!xn)..--|-)(?:[A-Za-z0-9-]+)(?\r\n"); pw.flush(); - if ( !Sendmail.readSMTPResponse(br, 250)) { + if ( !SendMail.readSMTPResponse(br, 250)) { continue; } pw.print("RCPT TO: <" + address + ">\r\n"); pw.flush(); - if ( !Sendmail.readSMTPResponse(br, 250)) { + if ( !SendMail.readSMTPResponse(br, 250)) { continue; } pw.print("QUIT\r\n"); pw.flush(); - if ( !Sendmail.readSMTPResponse(br, 221)) { + if ( !SendMail.readSMTPResponse(br, 221)) { continue; } @@ -190,4 +200,27 @@ public abstract class EmailProvider { }); } + public static boolean isValidMailAddress(String address) { + if ( !MAIL_ADDRESS.matcher(address).matches()) { + return false; + } + + String[] parts = address.split("@", 2); + + String local = parts[0]; + String domain = parts[1]; + + if ( !MAIL_LOCAL.matcher(local).matches()) { + return false; + } + + for (String domainPart : domain.split("\\.", -1)) { + if ( !DomainAssessment.isValidDomainPart(domainPart)) { + return false; + } + } + + return true; + } + }