antoine 2003/05/28 13:58:04
Modified: src/main/org/apache/tools/ant/listener MailLogger.java src/main/org/apache/tools/ant/taskdefs/email Mailer.java MimeMailer.java EmailTask.java docs/manual listeners.html docs/manual/CoreTasks mail.html . WHATSNEW Added: src/etc/testcases/taskdefs/email mail.xml src/testcases/org/apache/tools/ant/taskdefs/email EmailTaskTest.java Removed: src/etc/testcases/taskdefs mail.xml src/testcases/org/apache/tools/ant/taskdefs EmailTaskTest.java Log: Support for SMTP over TLS/SSL in the mail task PR: 19180 Revision Changes Path 1.19 +9 -5 ant/src/main/org/apache/tools/ant/listener/MailLogger.java Index: MailLogger.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/listener/MailLogger.java,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- MailLogger.java 28 May 2003 08:02:40 -0000 1.18 +++ MailLogger.java 28 May 2003 20:58:02 -0000 1.19 @@ -157,16 +157,18 @@ int port = Integer.parseInt(getValue(properties,"port",String.valueOf(MailMessage.DEFAULT_PORT))); String user = getValue(properties, "user", ""); String password = getValue(properties, "password", ""); + boolean ssl = Project.toBoolean(getValue(properties, + "ssl", "off")); String from = getValue(properties, "from", null); String replytoList = getValue(properties,"replyto",""); String toList = getValue(properties, prefix + ".to", null); String subject = getValue(properties, prefix + ".subject", (success) ? "Build Success" : "Build Failure"); - if (user.equals("") && password.equals("")) { + if (user.equals("") && password.equals("") && !ssl) { sendMail(mailhost, port, from, replytoList, toList, subject, buffer.substring(0)); } else { - sendMimeMail(event.getProject(), mailhost, port, user, password, from, replytoList, toList, subject, buffer.substring(0)); + sendMimeMail(event.getProject(), mailhost, port, user, password, ssl, from, replytoList, toList, subject, buffer.substring(0)); } } catch (Exception e) { System.out.println("MailLogger failed to send e-mail!"); @@ -256,15 +258,16 @@ * @param port mail server port number * @param user user name for SMTP auth * @param password password for SMTP auth + * @param ssl if true send message over SSL * @param from from address * @param replyToString comma-separated replyto list * @param toString comma-separated recipient list * @param subject mail subject * @param message mail body - * @exception IOException thrown if sending message fails */ - private void sendMimeMail(Project project, String host, int port, String user, String password, String from, String replyToString, String toString, - String subject, String message) throws IOException { + private void sendMimeMail(Project project, String host, int port, String user, String password, boolean ssl, + String from, String replyToString, String toString, + String subject, String message) { // convert the replyTo string into a vector of emailaddresses Mailer mailer = null; try { @@ -280,6 +283,7 @@ mailer.setPort(port); mailer.setUser(user); mailer.setPassword(password); + mailer.setSSL(ssl); Message mymessage = new Message(message); mymessage.setProject(project); mailer.setMessage(mymessage); 1.12 +13 -0 ant/src/main/org/apache/tools/ant/taskdefs/email/Mailer.java Index: Mailer.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/email/Mailer.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- Mailer.java 28 May 2003 08:02:41 -0000 1.11 +++ Mailer.java 28 May 2003 20:58:03 -0000 1.12 @@ -69,6 +69,7 @@ protected int port = -1; protected String user = null; protected String password = null; + protected boolean SSL = false; protected Message message; protected EmailAddress from; protected Vector replyToList = null; @@ -103,6 +104,7 @@ * Sets the user for smtp auth * * @param user + * @since ant 1.6 */ public void setUser(String user) { this.user = user; @@ -112,9 +114,20 @@ * Sets the password for smtp auth * * @param password + * @since ant 1.6 */ public void setPassword(String password) { this.password = password; + } + + /** + * Sets whether the user wants to send the mail through SSL + * + * @param SSL + * @since ant 1.6 + */ + public void setSSL(boolean SSL) { + this.SSL = SSL; } /** 1.12 +14 -1 ant/src/main/org/apache/tools/ant/taskdefs/email/MimeMailer.java Index: MimeMailer.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/email/MimeMailer.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- MimeMailer.java 27 May 2003 15:25:48 -0000 1.11 +++ MimeMailer.java 28 May 2003 20:58:03 -0000 1.12 @@ -66,6 +66,7 @@ import java.util.Properties; import java.util.StringTokenizer; import java.util.Vector; +import java.security.Security; import javax.activation.DataHandler; import javax.activation.FileDataSource; @@ -157,6 +158,19 @@ // alcohol :-) Session sesh; Authenticator auth; + if (SSL) { + try { + java.security.Provider p=(java.security.Provider)Class.forName( "com.sun.net.ssl.internal.ssl.Provider").newInstance(); + Security.addProvider(p); + } + catch (Exception e) { + throw new BuildException("could not instantiate ssl security provider, check that you have JSSE in your classpath"); + } + final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory"; + // SMTP provider + props.put( "mail.smtp.socketFactory.class", SSL_FACTORY); + props.put( "mail.smtp.socketFactory.fallback", "false"); + } if (user==null && password == null) { sesh = Session.getDefaultInstance(props, null); } @@ -165,7 +179,6 @@ auth = new SimpleAuthenticator(user,password); sesh = Session.getInstance(props,auth); } - //create the message MimeMessage msg = new MimeMessage(sesh); MimeMultipart attachments = new MimeMultipart(); 1.20 +18 -2 ant/src/main/org/apache/tools/ant/taskdefs/email/EmailTask.java Index: EmailTask.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/email/EmailTask.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- EmailTask.java 27 May 2003 15:25:48 -0000 1.19 +++ EmailTask.java 28 May 2003 20:58:03 -0000 1.20 @@ -108,7 +108,6 @@ } } - private String encoding = AUTO; /** host running SMTP */ private String host = "localhost"; @@ -146,6 +145,8 @@ private String user=null; /** Password for SMTP auth */ private String password=null; + /** indicate if the user wishes SSL-TLS */ + private boolean SSL = false; /** * sets the user for SMTP auth; this requires JavaMail @@ -166,6 +167,15 @@ } /** + * tells if the user needs to send his data over SSL + * @param SSL + * @since ant 1.6 + */ + public void setSSL(boolean SSL) { + this.SSL = SSL; + } + + /** * Allows the build writer to choose the preferred encoding method * * @param encoding The encoding (one of AUTO,MIME,UU,PLAIN) @@ -466,9 +476,14 @@ } } // SMTP auth only allowed with MIME mail - if (autoFound==false && ((user !=null) || (password != null)) && (encoding.equals(UU) || encoding.equals(PLAIN))) { + if (autoFound==false && ((user !=null) || (password != null) ) && (encoding.equals(UU) || encoding.equals(PLAIN))) { throw new BuildException("SMTP auth only possible with MIME mail"); } + // SSL only allowed with MIME mail + if (autoFound==false && (SSL) && (encoding.equals(UU) || encoding.equals(PLAIN))) { + throw new BuildException("SSL only possible with MIME mail"); + } + // try UU format if (encoding.equals(UU) @@ -564,6 +579,7 @@ mailer.setPort(port); mailer.setUser(user); mailer.setPassword(password); + mailer.setSSL(SSL); mailer.setMessage(message); mailer.setFrom(from); mailer.setReplyToList(replyToList); 1.1 ant/src/etc/testcases/taskdefs/email/mail.xml Index: mail.xml =================================================================== <?xml version="1.0"?> <project name="mail-test" basedir="." default="test1"> <target name="test1"> <!-- this test is supposed to bring a build exception because user and password is not allowed with plain encoding --> <mail host="localhost" port="25" from="[EMAIL PROTECTED]" to="[EMAIL PROTECTED]" subject="hello" encoding="plain" user="joe" password="secret"> <message> Hi Laura, how are you doing ? </message> </mail> </target> <target name="test2"> <!-- this test is supposed to bring a build exception because SSL is not allowed with plain encoding --> <mail host="localhost" port="465" from="[EMAIL PROTECTED]" to="[EMAIL PROTECTED]" subject="hello" encoding="plain" ssl="true"> <message> Hi Laura, how are you doing ? </message> </mail> </target> </project> 1.1 ant/src/testcases/org/apache/tools/ant/taskdefs/email/EmailTaskTest.java Index: EmailTaskTest.java =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "Ant" and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.tools.ant.taskdefs.email; import org.apache.tools.ant.BuildFileTest; /** * TODO : develop these testcases - the email task needs to have attributes allowing * to simulate sending mail and to catch the output in text files or streams * @author <a href="mailto:[EMAIL PROTECTED]">Antoine Levy-Lambert</a> */ public class EmailTaskTest extends BuildFileTest { public EmailTaskTest(String name) { super(name); } public void setUp() { configureProject("src/etc/testcases/taskdefs/email/mail.xml"); } public void test1() { expectBuildException("test1", "SMTP auth only possible with MIME mail"); } public void test2() { expectBuildException("test2", "SSL only possible with MIME mail"); } } 1.14 +7 -0 ant/docs/manual/listeners.html Index: listeners.html =================================================================== RCS file: /home/cvs/ant/docs/manual/listeners.html,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- listeners.html 27 May 2003 15:33:25 -0000 1.13 +++ listeners.html 28 May 2003 20:58:03 -0000 1.14 @@ -138,6 +138,13 @@ the email message will be then sent using Mime and requires JavaMail</td> </tr> <tr> + <td width="337">MailLogger.ssl</td> + <td width="63%">on or true if ssl is needed<br/> + This feature requires JavaMail</td> + <td width="63%"> + no</td> + </tr> + <tr> <td width="337">MailLogger.from</td> <td width="63%">Mail "from" address</td> <td width="63%">Yes, if mail needs to be sent</td> 1.20 +7 -1 ant/docs/manual/CoreTasks/mail.html Index: mail.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTasks/mail.html,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- mail.html 27 May 2003 15:33:25 -0000 1.19 +++ mail.html 28 May 2003 20:58:03 -0000 1.20 @@ -13,7 +13,7 @@ This task can send mail using either plain text, UU encoding, or MIME format mail, depending on what is available.<br/> <br/> -If you need SMTP auth, you have to use MIME (and therefore to install JavaMail).<br/><br/> +SMTP auth and SSL/TLS require JavaMail and are only available in MIME format.<br/><br/> Attachments may be sent using nested <a href="../CoreTypes/fileset.html">fileset</a> elements.</p> <p><strong>Note:</strong> This task may depend on external libraries @@ -112,6 +112,12 @@ <td valign="top">password for SMTP auth</td> <td valign="center">Yes, if SMTP auth is required on your SMTP server<br/> the email message will be then sent using Mime and requires JavaMail</td> + </tr> + <tr> + <td valign="top">ssl</td> + <td valign="top">"true", "on" or "yes" accepted here<br/> + indicates whether you need TLS/SSL</td> + <td valign="center">No</td> </tr> <tr> <td valign="top">encoding</td> 1.431 +3 -0 ant/WHATSNEW Index: WHATSNEW =================================================================== RCS file: /home/cvs/ant/WHATSNEW,v retrieving revision 1.430 retrieving revision 1.431 diff -u -r1.430 -r1.431 --- WHATSNEW 28 May 2003 13:12:02 -0000 1.430 +++ WHATSNEW 28 May 2003 20:58:03 -0000 1.431 @@ -307,6 +307,9 @@ Implementation with plain mail remains to do. Bugzilla Report 5969. +* <mail> and mailloger support SMTP over TLS/SSL +Bugzilla Report 19180. + * <zipfileset> can now be defined in the main body of a project and referred to with refid="xyz". Bugzilla Report 17007.