151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1995, 2000, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*- 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * mailto stream opener 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage sun.net.www.protocol.mailto; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.URL; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.URLConnection; 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.URLStreamHandler; 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.*; 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.net.www.*; 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski//import sun.net.www.protocol.news.ArticlePoster; 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.net.smtp.SmtpClient; 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** open an nntp input stream given a URL */ 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class Handler extends URLStreamHandler { 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// private String decodePercent(String s) { 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// if (s==null || s.indexOf('%') < 0) 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// return s; 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// int limit = s.length(); 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// char d[] = new char[limit]; 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// int dp = 0; 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// for (int sp = 0; sp < limit; sp++) { 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// int c = s.charAt(sp); 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// if (c == '%' && sp + 2 < limit) { 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// int s1 = s.charAt(sp + 1); 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// int s2 = s.charAt(sp + 2); 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// if ('0' <= s1 && s1 <= '9') 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// s1 = s1 - '0'; 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// else if ('a' <= s1 && s1 <= 'f') 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// s1 = s1 - 'a' + 10; 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// else if ('A' <= s1 && s1 <= 'F') 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// s1 = s1 - 'A' + 10; 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// else 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// s1 = -1; 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// if ('0' <= s2 && s2 <= '9') 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// s2 = s2 - '0'; 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// else if ('a' <= s2 && s2 <= 'f') 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// s2 = s2 - 'a' + 10; 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// else if ('A' <= s2 && s2 <= 'F') 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// s2 = s2 - 'A' + 10; 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// else 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// s2 = -1; 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// if (s1 >= 0 && s2 >= 0) { 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// c = (s1 << 4) | s2; 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// sp += 2; 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// } 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// } 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// d[dp++] = (char) c; 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// } 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// return new String(d, 0, dp); 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// } 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// public InputStream openStream(URL u) { 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// String dest = u.file; 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// String subj = ""; 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// int lastsl = dest.lastIndexOf('/'); 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// if (lastsl >= 0) { 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// int st = dest.charAt(0) == '/' ? 1 : 0; 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// if (lastsl > st) 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// subj = dest.substring(st, lastsl); 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// dest = dest.substring(lastsl + 1); 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// } 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// if (u.postData != null) { 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// ArticlePoster.MailTo("Posted form", 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// decodePercent(dest), 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// u.postData); 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// } 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// else 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// ArticlePoster.MailTo(decodePercent(subj), decodePercent(dest)); 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// return null; 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// } 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized URLConnection openConnection(URL u) { 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new MailToURLConnection(u); 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method is called to parse the string spec into URL u for a 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * mailto protocol. 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param u the URL to receive the result of parsing the spec 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param spec the URL string to parse 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param start the character position to start parsing at. This is 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * just past the ':'. 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param limit the character position to stop parsing at. 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void parseURL(URL u, String spec, int start, int limit) { 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String protocol = u.getProtocol(); 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String host = ""; 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int port = u.getPort(); 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String file = ""; 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (start < limit) { 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski file = spec.substring(start, limit); 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Let's just make sure we DO have an Email address in the URL. 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean nogood = false; 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (file == null || file.equals("")) 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski nogood = true; 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else { 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean allwhites = true; 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (int i = 0; i < file.length(); i++) 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!Character.isWhitespace(file.charAt(i))) 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski allwhites = false; 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (allwhites) 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski nogood = true; 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (nogood) 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new RuntimeException("No email address"); 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setURL(u, protocol, host, port, file, null); 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 145