[kaffe] CVS kaffe (robilad): Resynced with GNU inetlib: small fixes for ftp & http handlers and a comsat hand

Kaffe CVS cvs-commits at kaffe.org
Sun Oct 10 11:14:28 PDT 2004


PatchSet 5263 
Date: 2004/10/10 17:57:28
Author: robilad
Branch: HEAD
Tag: (none) 
Log:
Resynced with GNU inetlib: small fixes for ftp & http handlers and a comsat handler

2004-10-10  Dalibor Topic  <robilad at kaffe.org>

        * libraries/javalib/Makefile.am,
        libraries/javalib/Makefile.in,
        libraries/javalib/all.files:
        Regenerated.

        * libraries/javalib/gnu/inet/comsat/ComsatClient.java,
        libraries/javalib/gnu/inet/comsat/ComsatInfo.java:
        New files, taken from GNU inetlib.

        * libraries/javalib/gnu/inet/ftp/FTPConnection.java,
        libraries/javalib/gnu/inet/ftp/package.html,
        libraries/javalib/gnu/inet/http/ChunkedInputStream.java:
        Resynced with GNU inetlib.

        2004-10-05  Chris Burdess  <dog at bluezoo.org>

        * ChunkedInputStream.java: Permit EOF before CRLF.
        * FTPConnection.java: Implement FTP/TLS.
        * comsat: Experimental comsat client.

Members: 
	ChangeLog:1.2816->1.2817 
	libraries/javalib/Makefile.am:1.248->1.249 
	libraries/javalib/Makefile.in:1.328->1.329 
	libraries/javalib/all.files:1.36->1.37 
	libraries/javalib/gnu/inet/comsat/ComsatClient.java:INITIAL->1.1 
	libraries/javalib/gnu/inet/comsat/ComsatInfo.java:INITIAL->1.1 
	libraries/javalib/gnu/inet/ftp/FTPConnection.java:1.5->1.6 
	libraries/javalib/gnu/inet/ftp/package.html:1.1->1.2 
	libraries/javalib/gnu/inet/http/ChunkedInputStream.java:1.3->1.4 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.2816 kaffe/ChangeLog:1.2817
--- kaffe/ChangeLog:1.2816	Sun Oct 10 16:28:43 2004
+++ kaffe/ChangeLog	Sun Oct 10 17:57:28 2004
@@ -1,5 +1,27 @@
 2004-10-10  Dalibor Topic  <robilad at kaffe.org>
 
+	* libraries/javalib/Makefile.am,
+	libraries/javalib/Makefile.in,
+	libraries/javalib/all.files:
+	Regenerated.
+
+	* libraries/javalib/gnu/inet/comsat/ComsatClient.java,
+	libraries/javalib/gnu/inet/comsat/ComsatInfo.java:
+	New files, taken from GNU inetlib.
+
+	* libraries/javalib/gnu/inet/ftp/FTPConnection.java,
+	libraries/javalib/gnu/inet/ftp/package.html,
+	libraries/javalib/gnu/inet/http/ChunkedInputStream.java:
+	Resynced with GNU inetlib.
+
+	2004-10-05  Chris Burdess  <dog at bluezoo.org>
+
+        * ChunkedInputStream.java: Permit EOF before CRLF.
+        * FTPConnection.java: Implement FTP/TLS.
+        * comsat: Experimental comsat client.
+
+2004-10-10  Dalibor Topic  <robilad at kaffe.org>
+
 	* libraries/clib/awt/classpath-gtk/gtk-peer/gdkfont.h,
 	libraries/clib/awt/classpath-gtk/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c:
 	Resynced with GNU Classpath.
Index: kaffe/libraries/javalib/Makefile.am
diff -u kaffe/libraries/javalib/Makefile.am:1.248 kaffe/libraries/javalib/Makefile.am:1.249
--- kaffe/libraries/javalib/Makefile.am:1.248	Sun Oct 10 14:28:19 2004
+++ kaffe/libraries/javalib/Makefile.am	Sun Oct 10 17:57:34 2004
@@ -101,6 +101,7 @@
 	$(gnu_crypto_tool_keytool_SRCS) \
 	$(gnu_crypto_util_SRCS) \
 	$(gnu_getopt_SRCS) \
+	$(gnu_inet_comsat_SRCS) \
 	$(gnu_inet_finger_SRCS) \
 	$(gnu_inet_ftp_SRCS) \
 	$(gnu_inet_gopher_SRCS) \
@@ -784,6 +785,9 @@
 gnu_getopt_SRCS = \
 	gnu/getopt/Getopt.java \
 	gnu/getopt/LongOpt.java
+gnu_inet_comsat_SRCS = \
+	gnu/inet/comsat/ComsatClient.java \
+	gnu/inet/comsat/ComsatInfo.java
 gnu_inet_finger_SRCS = \
 	gnu/inet/finger/FingerConnection.java \
 	gnu/inet/finger/FingerURLConnection.java \
Index: kaffe/libraries/javalib/Makefile.in
diff -u kaffe/libraries/javalib/Makefile.in:1.328 kaffe/libraries/javalib/Makefile.in:1.329
--- kaffe/libraries/javalib/Makefile.in:1.328	Sun Oct 10 14:28:19 2004
+++ kaffe/libraries/javalib/Makefile.in	Sun Oct 10 17:57:35 2004
@@ -442,6 +442,7 @@
 	$(gnu_crypto_tool_keytool_SRCS) \
 	$(gnu_crypto_util_SRCS) \
 	$(gnu_getopt_SRCS) \
+	$(gnu_inet_comsat_SRCS) \
 	$(gnu_inet_finger_SRCS) \
 	$(gnu_inet_ftp_SRCS) \
 	$(gnu_inet_gopher_SRCS) \
@@ -1172,6 +1173,10 @@
 gnu_getopt_SRCS = \
 	gnu/getopt/Getopt.java \
 	gnu/getopt/LongOpt.java
+
+gnu_inet_comsat_SRCS = \
+	gnu/inet/comsat/ComsatClient.java \
+	gnu/inet/comsat/ComsatInfo.java
 
 gnu_inet_finger_SRCS = \
 	gnu/inet/finger/FingerConnection.java \
Index: kaffe/libraries/javalib/all.files
diff -u kaffe/libraries/javalib/all.files:1.36 kaffe/libraries/javalib/all.files:1.37
--- kaffe/libraries/javalib/all.files:1.36	Sun Oct 10 14:28:20 2004
+++ kaffe/libraries/javalib/all.files	Sun Oct 10 17:57:37 2004
@@ -419,6 +419,8 @@
 gnu/crypto/util/Util.java
 gnu/getopt/Getopt.java
 gnu/getopt/LongOpt.java
+gnu/inet/comsat/ComsatClient.java
+gnu/inet/comsat/ComsatInfo.java
 gnu/inet/finger/FingerConnection.java
 gnu/inet/finger/FingerURLConnection.java
 gnu/inet/finger/Handler.java
===================================================================
Checking out kaffe/libraries/javalib/gnu/inet/comsat/ComsatClient.java
RCS:  /home/cvs/kaffe/kaffe/libraries/javalib/gnu/inet/comsat/ComsatClient.java,v
VERS: 1.1
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/libraries/javalib/gnu/inet/comsat/ComsatClient.java	Sun Oct 10 18:14:27 2004
@@ -0,0 +1,138 @@
+/*
+ * $Id: ComsatClient.java,v 1.1 2004/10/10 17:57:38 robilad Exp $
+ * Copyright (C) 2004 The Free Software Foundation
+ * 
+ * This file is part of GNU inetlib, a library.
+ * 
+ * GNU inetlib is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * GNU inetlib is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * 
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.inet.comsat;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.util.StringTokenizer;
+
+/**
+ * Simple comsat client.
+ *
+ * @author <a href='mailto:dog at gnu.org'>Chris Burdess</a>
+ */
+public class ComsatClient
+{
+
+  /**
+   * The default comsat port.
+   */
+  public static final int DEFAULT_PORT = 512;
+
+  protected DatagramSocket socket;
+
+  public ComsatClient ()
+    throws IOException
+  {
+    this (DEFAULT_PORT, 0);
+  }
+  
+  public ComsatClient (int port, int timeout)
+    throws IOException
+  {
+    if (port < 0)
+      {
+        port = DEFAULT_PORT;
+      }
+    
+    socket = new DatagramSocket (port);
+    if (timeout > 0)
+      {
+        socket.setSoTimeout (timeout);
+      }
+    socket.setReceiveBufferSize (1024);
+  }
+
+  public void close ()
+    throws IOException
+  {
+    socket.close ();
+  }
+
+  public ComsatInfo read ()
+    throws IOException
+  {
+    byte[] buf = new byte[socket.getReceiveBufferSize ()];
+    int len = buf.length;
+    DatagramPacket packet = new DatagramPacket (buf, len);
+    socket.receive (packet);
+    buf = packet.getData ();
+    len = packet.getLength ();
+    String data = new String (buf, 0, len, "ISO-8859-1");
+
+    ComsatInfo info = new ComsatInfo ();
+    StringTokenizer st = new StringTokenizer (data, "\n");
+    String mailbox = st.nextToken ();
+    info.setMailbox (mailbox);
+    boolean inBody = false;
+    String lastHeader = null;
+    while (st.hasMoreTokens ())
+      {
+        String line = st.nextToken ();
+        if (inBody)
+          {
+            String body = info.getBody ();
+            if (body == null)
+              {
+                body = line;
+              }
+            else
+              {
+                body += "\n" + line;
+              }
+            info.setBody (body);
+          }
+        else
+          {
+            if (line.length () == 0)
+              {
+                inBody = true;
+              }
+            else
+              {
+                int ci = line.indexOf (':');
+                if (ci != -1)
+                  {
+                    lastHeader = line.substring (0, ci);
+                    info.setHeader (lastHeader,
+                                    line.substring (ci + 1).trim ());
+                  }
+                else
+                  {
+                    String val = info.getHeader (lastHeader);
+                    val += "\n" + line;
+                    info.setHeader (lastHeader, val);
+                  }
+              }
+          }
+      }
+    return info;
+  }
+
+}
===================================================================
Checking out kaffe/libraries/javalib/gnu/inet/comsat/ComsatInfo.java
RCS:  /home/cvs/kaffe/kaffe/libraries/javalib/gnu/inet/comsat/ComsatInfo.java,v
VERS: 1.1
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/libraries/javalib/gnu/inet/comsat/ComsatInfo.java	Sun Oct 10 18:14:28 2004
@@ -0,0 +1,92 @@
+/*
+ * $Id: ComsatInfo.java,v 1.1 2004/10/10 17:57:38 robilad Exp $
+ * Copyright (C) 2004 The Free Software Foundation
+ * 
+ * This file is part of GNU inetlib, a library.
+ * 
+ * GNU inetlib is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * GNU inetlib is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * 
+ * As a special exception, if you link this library with other files to
+ * produce an executable, this library does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why the
+ * executable file might be covered by the GNU General Public License.
+ */
+
+package gnu.inet.comsat;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * A comsat notification message.
+ *
+ * @author <a href='mailto:dog at gnu.org'>Chris Burdess</a>
+ */
+public class ComsatInfo
+{
+
+  /**
+   * The mailbox in which the new message appeared.
+   */
+  protected String mailbox;
+
+  /**
+   * The message headers.
+   */
+  protected Map headers;
+
+  /**
+   * The first few lines of the message body.
+   */
+  protected String body;
+
+  public String getMailbox ()
+  {
+    return mailbox;
+  }
+
+  protected void setMailbox (String mailbox)
+  {
+    this.mailbox = mailbox;
+  }
+
+  public String getHeader (String key)
+  {
+    return (String) headers.get (key);
+  }
+
+  public Iterator getHeaderNames ()
+  {
+    return headers.keySet ().iterator ();
+  }
+
+  protected void setHeader (String key, String value)
+  {
+    headers.put (key, value);
+  }
+
+  public String getBody ()
+  {
+    return body;
+  }
+
+  protected void setBody (String body)
+  {
+    this.body = body;
+  }
+  
+}
Index: kaffe/libraries/javalib/gnu/inet/ftp/FTPConnection.java
diff -u kaffe/libraries/javalib/gnu/inet/ftp/FTPConnection.java:1.5 kaffe/libraries/javalib/gnu/inet/ftp/FTPConnection.java:1.6
--- kaffe/libraries/javalib/gnu/inet/ftp/FTPConnection.java:1.5	Mon Oct  4 19:33:56 2004
+++ kaffe/libraries/javalib/gnu/inet/ftp/FTPConnection.java	Sun Oct 10 17:57:38 2004
@@ -1,5 +1,5 @@
 /*
- * $Id: FTPConnection.java,v 1.5 2004/10/04 19:33:56 robilad Exp $
+ * $Id: FTPConnection.java,v 1.6 2004/10/10 17:57:38 robilad Exp $
  * Copyright (C) 2003 The Free Software Foundation
  * 
  * This file is part of GNU inetlib, a library.
@@ -38,10 +38,18 @@
 import java.net.ProtocolException;
 import java.net.Socket;
 import java.net.UnknownHostException;
+import java.security.GeneralSecurityException;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+
 import gnu.inet.util.CRLFInputStream;
+import gnu.inet.util.CRLFOutputStream;
+import gnu.inet.util.EmptyX509TrustManager;
 import gnu.inet.util.LineInputStream;
 
 /**
@@ -54,7 +62,7 @@
  * </ul>
  *
  * @author <a href='mailto:dog at gnu.org'>Chris Burdess</a>
- * @version $Revision: 1.5 $ $Date: 2004/10/04 19:33:56 $
+ * @version $Revision: 1.6 $ $Date: 2004/10/10 17:57:38 $
  */
 public class FTPConnection
 {
@@ -105,6 +113,12 @@
   protected static final String STAT = "STAT";
   protected static final String HELP = "HELP";
   protected static final String NOOP = "NOOP";
+  
+  protected static final String AUTH = "AUTH";
+  protected static final String PBSZ = "PBSZ";
+  protected static final String PROT = "PROT";
+  protected static final String CCC = "CCC";
+  protected static final String TLS = "TLS";
 
   public static final int TYPE_ASCII = 1;
   public static final int TYPE_EBCDIC = 2;
@@ -120,7 +134,6 @@
 
   // -- Telnet constants --
   private static final String US_ASCII = "US-ASCII";
-  private static final byte[] CRLF = { 0x0d, 0x0a };
 
   /**
    * The socket used to communicate with the server.
@@ -135,7 +148,7 @@
   /**
    * The socket output stream.
    */
-  protected OutputStream out;
+  protected CRLFOutputStream out;
 
   /**
    * The timeout when attempting to connect a socket.
@@ -239,7 +252,8 @@
     in = new CRLFInputStream (in);
     this.in = new LineInputStream (in);
     OutputStream out = socket.getOutputStream ();
-    this.out = new BufferedOutputStream (out);
+    out = new BufferedOutputStream (out);
+    this.out = new CRLFOutputStream (out);
     
     // Read greeting
     FTPResponse response = getResponse ();
@@ -293,6 +307,109 @@
         throw new FTPException (response);
       }
   }
+
+  /**
+   * Negotiates TLS over the current connection.
+   * See IETF draft-murray-auth-ftp-ssl-15.txt for details.
+   * @param confidential whether to provide confidentiality for the
+   * connection
+   */
+  public boolean starttls (boolean confidential)
+    throws IOException
+  {
+    return starttls (confidential, new EmptyX509TrustManager ());
+  }
+  
+  /**
+   * Negotiates TLS over the current connection.
+   * See IETF draft-murray-auth-ftp-ssl-15.txt for details.
+   * @param confidential whether to provide confidentiality for the
+   * connection
+   * @param tm the trust manager used to validate the server certificate.
+   */
+  public boolean starttls (boolean confidential, TrustManager tm)
+    throws IOException
+  {
+    try
+      {
+        // Use SSLSocketFactory to negotiate a TLS session and wrap the
+        // current socket.
+        SSLContext context = SSLContext.getInstance ("TLS");
+        // We don't require strong validation of the server certificate
+        TrustManager[] trust = new TrustManager[] { tm };
+        context.init (null, trust, null);
+        SSLSocketFactory factory = context.getSocketFactory ();
+        
+        send (AUTH + ' ' + TLS);
+        FTPResponse response = getResponse ();
+        switch (response.getCode ())
+          {
+          case 500:
+          case 502:
+          case 504:
+          case 534:
+          case 431:
+            return false;
+          case 234:
+            break;
+          default:
+            throw new FTPException (response);
+          }
+        
+        String hostname = socket.getInetAddress ().getHostName ();
+        int port = socket.getPort ();
+        SSLSocket ss =
+          (SSLSocket) factory.createSocket (socket, hostname, port, true);
+        String[] protocols = { "TLSv1", "SSLv3" };
+        ss.setEnabledProtocols (protocols);
+        ss.setUseClientMode (true);
+        ss.startHandshake ();
+
+        // PBSZ:PROT sequence
+        send (PBSZ + ' ' + Integer.MAX_VALUE);
+        response = getResponse ();
+        switch (response.getCode ())
+          {
+          case 501: // syntax error
+          case 503: // not authenticated
+            return false;
+          case 200:
+            break;
+          default:
+            throw new FTPException (response);
+          }
+        send (PROT + ' ' + (confidential ? 'P' : 'C'));
+        response = getResponse ();
+        switch (response.getCode ())
+          {
+          case 503: // not authenticated
+          case 504: // invalid level
+          case 536: // level not supported
+            return false;
+          case 200:
+            break;
+          default:
+            throw new FTPException (response);
+          }
+        
+        if (confidential)
+          {
+            // Set up streams
+            InputStream in = ss.getInputStream ();
+            in = new BufferedInputStream (in);
+            in = new CRLFInputStream (in);
+            this.in = new LineInputStream (in);
+            OutputStream out = ss.getOutputStream ();
+            out = new BufferedOutputStream (out);
+            this.out = new CRLFOutputStream (out);
+          }
+        return true;
+      }
+    catch (GeneralSecurityException e)
+      {
+        return false;
+      }
+  }
   
   /**
    * Changes directory to the specified path.
@@ -1104,7 +1221,7 @@
   {
     byte[] data = cmd.getBytes (US_ASCII);
     out.write (data);
-    out.write (CRLF);
+    out.writeln ();
     out.flush ();
   }
 
Index: kaffe/libraries/javalib/gnu/inet/ftp/package.html
diff -u kaffe/libraries/javalib/gnu/inet/ftp/package.html:1.1 kaffe/libraries/javalib/gnu/inet/ftp/package.html:1.2
--- kaffe/libraries/javalib/gnu/inet/ftp/package.html:1.1	Sun Jul 25 22:46:18 2004
+++ kaffe/libraries/javalib/gnu/inet/ftp/package.html	Sun Oct 10 17:57:39 2004
@@ -10,4 +10,9 @@
 concurrent stream (input or output) is supported.
 </p>
 
+<p>
+The control connection to the server can be protected using TLS
+(the starttls method).
+</p>
+
 </body>
Index: kaffe/libraries/javalib/gnu/inet/http/ChunkedInputStream.java
diff -u kaffe/libraries/javalib/gnu/inet/http/ChunkedInputStream.java:1.3 kaffe/libraries/javalib/gnu/inet/http/ChunkedInputStream.java:1.4
--- kaffe/libraries/javalib/gnu/inet/http/ChunkedInputStream.java:1.3	Mon Oct  4 19:33:58 2004
+++ kaffe/libraries/javalib/gnu/inet/http/ChunkedInputStream.java	Sun Oct 10 17:57:41 2004
@@ -1,5 +1,5 @@
 /*
- * $Id: ChunkedInputStream.java,v 1.3 2004/10/04 19:33:58 robilad Exp $
+ * $Id: ChunkedInputStream.java,v 1.4 2004/10/10 17:57:41 robilad Exp $
  * Copyright (C) 2004 The Free Software Foundation
  * 
  * This file is part of GNU inetlib, a library.
@@ -141,6 +141,12 @@
             // Read CRLF
             int c1 = in.read ();
             int c2 = in.read ();
+            if (c1 == -1 && c2 == -1)
+              {
+                // EOF before CRLF: bad, but ignore
+                eof = true;
+                return -1;
+              }
             if (c1 != 0x0d || c2 != 0x0a)
               {
                 throw new ProtocolException ("expecting CRLF: " + c1 + "," + c2);



More information about the kaffe mailing list