diff --git a/src/zutil/network/FTPClient.java b/src/zutil/network/FTPClient.java index d5f202c..cd6c8e6 100644 --- a/src/zutil/network/FTPClient.java +++ b/src/zutil/network/FTPClient.java @@ -25,6 +25,8 @@ import zutil.MultiPrintStream; * TODO: file info, rename, Active mode */ public class FTPClient extends Thread{ + public static boolean DEBUG = false; + public static final int FTP_ACTIVE = 0; public static final int FTP_PASSIVE = 1; public static final int FTP_PORT = 21; @@ -90,8 +92,8 @@ public class FTPClient extends Thread{ readCommand(true); sendCommand("USER "+user); sendNoReplyCommand("PASS "+pass, false); - System.out.println("PASS ***"); - String tmp = readMultipleCommands(true); + if(DEBUG)System.out.println("PASS ***"); + String tmp = readMultipleCommands(DEBUG); if(parseReturnCode(tmp) == FTPC_LOGIN_NO){ close(); throw new AccountException(tmp); @@ -112,7 +114,7 @@ public class FTPClient extends Thread{ * @throws IOException */ public synchronized int sendCommand(String cmd) throws IOException{ - return parseReturnCode(sendCommand(cmd, true)); + return parseReturnCode(sendCommand(cmd, DEBUG)); } /** @@ -203,7 +205,7 @@ public class FTPClient extends Thread{ LinkedList list = new LinkedList(); BufferedReader data_in = getDataInputStream(); - sendCommand("NLST "+path, true); + sendCommand("NLST "+path, DEBUG); String tmp = ""; while((tmp = data_in.readLine()) != null){ @@ -211,7 +213,7 @@ public class FTPClient extends Thread{ } data_in.close(); - readCommand(true); + readCommand(DEBUG); return list; } @@ -237,7 +239,7 @@ public class FTPClient extends Thread{ } data_in.close(); - readCommand(true); + readCommand(DEBUG); return info.toString(); } @@ -250,10 +252,10 @@ public class FTPClient extends Thread{ */ public void sendFile(String path, String data) throws IOException{ PrintStream data_out = getDataOutputStream(); - sendCommand("STOR "+path, true); + sendCommand("STOR "+path, DEBUG); data_out.println(data); data_out.close(); - readCommand(true); + readCommand(DEBUG); } /** @@ -278,7 +280,7 @@ public class FTPClient extends Thread{ */ private BufferedReader getFile(String path) throws IOException{ BufferedReader ret = getDataInputStream(); - sendCommand("RETR "+path, true); + sendCommand("RETR "+path, DEBUG); return ret; } @@ -297,7 +299,7 @@ public class FTPClient extends Thread{ while((tmp = file_in.readLine()) != null){ file_out.println(tmp); } - readCommand(true); + readCommand(DEBUG); } /** @@ -440,7 +442,7 @@ public class FTPClient extends Thread{ * @throws IOException */ private int setPassiveMode() throws IOException{ - String tmp = sendCommand("PASV", true); + String tmp = sendCommand("PASV", DEBUG); if(parseReturnCode(tmp) != FTPC_ENTERING_PASSIVE){ throw new IOException(tmp); } @@ -479,7 +481,7 @@ public class FTPClient extends Thread{ */ @SuppressWarnings("deprecation") public void close() throws IOException{ - sendCommand("QUIT", true); + sendCommand("QUIT", DEBUG); in.close(); out.close(); socket.close(); diff --git a/src/zutil/network/POP3Client.java b/src/zutil/network/POP3Client.java new file mode 100644 index 0000000..ad6c458 --- /dev/null +++ b/src/zutil/network/POP3Client.java @@ -0,0 +1,317 @@ +package zutil.network; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.net.Socket; +import java.net.UnknownHostException; + +import javax.net.SocketFactory; +import javax.net.ssl.SSLSocketFactory; + +/** + * A simple class that connects and logs in to a POP3 + * server and then can read and delete messages. + * INFO: http://pages.prodigy.net/michael_santovec/pop3telnet.htm + * + * @author Ziver + * + */ +public class POP3Client { + public static boolean DEBUG = false; + public static final int POP3_PORT = 110; + public static final int POP3_SSL_PORT = 995; + + private BufferedReader in; + private PrintStream out; + private Socket socket; + + /** + * Connect to a POP3 server without username + * + * @param host The hostname of the server + * @throws UnknownHostException + * @throws IOException + */ + public POP3Client(String host) throws UnknownHostException, IOException{ + this(host, POP3_PORT, null, null, false); + } + + /** + * Connect to a POP3 server with username and password + * + * @param host The hostname of the server + * @param user The username + * @param password the password + * @throws UnknownHostException + * @throws IOException + */ + public POP3Client(String host, String user, String password) throws UnknownHostException, IOException{ + this(host, POP3_PORT, user, password, false); + } + + /** + * Connects to a POP3 server with username and password and SSL + * + * @param host The hostname of the server + * @param user The username + * @param password the password + * @param ssl If SSL should be used + * @throws UnknownHostException + * @throws IOException + */ + public POP3Client(String host, String user, String password, boolean ssl) throws UnknownHostException, IOException{ + this(host, (ssl ? POP3_SSL_PORT : POP3_PORT), user, password, ssl); + } + + /** + * Connects to a POP3 server with username and password and + * SSL and with costume port. + * + * @param host The hostname of the server + * @param port The port number to connect to on the server + * @param user The username + * @param password the password + * @param ssl If SSL should be used + * @throws UnknownHostException + * @throws IOException + */ + public POP3Client(String host, int port, String user, String password, boolean ssl) throws UnknownHostException, IOException{ + if(ssl) connectSSL(host, port); + else connect(host, port); + + if(user != null){ + login(user, password); + } + } + + /** + * Connects to the server + * + * @param host The hostname of the server + * @param port The port to connect to on the server + * @throws UnknownHostException + * @throws IOException + */ + private void connect(String host, int port) throws UnknownHostException, IOException{ + socket = new Socket(host, port); + in = new BufferedReader(new InputStreamReader(socket.getInputStream())); + out = new PrintStream(socket.getOutputStream()); + + readCommand(true); + } + + /** + * Connects to the server with SSL. + * http://www.exampledepot.com/egs/javax.net.ssl/Client.html + * + * @param host The hostname of the server + * @param port The port to connect to on the server + * @throws UnknownHostException + * @throws IOException + */ + private void connectSSL(String host, int port) throws UnknownHostException, IOException{ + SocketFactory socketFactory = SSLSocketFactory.getDefault(); + socket = socketFactory.createSocket(host, port); + + in = new BufferedReader(new InputStreamReader(socket.getInputStream())); + out = new PrintStream(socket.getOutputStream()); + + readCommand(DEBUG); + } + + /** + * Logs in to the POP3 server with the username and password if the password is set + * + * @param user The user name + * @param password The password or null if no password is required + * @throws IOException + */ + private void login(String user, String password) throws IOException{ + sendCommand("USER "+user); + if(password != null){ + sendNoReplyCommand("PASS "+password, false); + if(DEBUG)System.out.println("PASS ***"); + readCommand(DEBUG); + } + } + + /** + * Returns the number of messages that is on the server + * + * @return Message count + * @throws IOException + */ + public int getMessageCount() throws IOException{ + String msg = sendCommand("STAT", DEBUG); + return Integer.parseInt( + msg.substring( + msg.indexOf(' ')+1, + msg.indexOf(' ', msg.indexOf(' ')+1))); + } + + /** + * Retrieves the message with the given id. + * + * @param id The id of the message to get + * @return The message + * @throws IOException + */ + public String getMessage(int id) throws IOException{ + sendCommand("RETR "+id); + return readMultipleLines(DEBUG); + } + + /** + * Returns the title of the message + * + * @param id The message id + * @return The title + * @throws IOException + */ + public String getMessageTitle(int id) throws IOException{ + String tmp = getMessageHeader(id); + String tmp2 = tmp.toLowerCase(); + if(tmp2.contains("subject:")){ + return tmp.substring( + tmp2.indexOf("subject:")+8, + tmp2.indexOf('\n', + tmp2.indexOf("subject:"))); + } + else + return null; + } + + /** + * Returns the header of the given message id. + * + * @param id The id of the message to get + * @return The message + * @throws IOException + */ + public String getMessageHeader(int id) throws IOException{ + sendCommand("TOP "+id+" 0"); + return readMultipleLines(DEBUG); + } + + /** + * Deletes the message with the given id + * + * @param id The id of the message to be deleted + * @throws IOException + */ + public void delete(int id) throws IOException{ + sendCommand("DELE "+id); + } + + +//*********************** IO Stuff ********************************************* + + /** + * Sends the given line to the server and returns a status integer + * + * @param cmd The command to send + * @return The return code from the server + * @throws IOException if the cmd fails + */ + private boolean sendCommand(String cmd) throws IOException{ + return parseReturnCode(sendCommand(cmd, DEBUG)); + } + + /** + * Sends the given line to the server and returns the last line + * + * @param cmd The command to send + * @param print To print out the received lines + * @return Last String line from the server + * @throws IOException + */ + private String sendCommand(String cmd, boolean print) throws IOException{ + sendNoReplyCommand(cmd, print); + return readCommand(print); + } + + /** + * Sends a given command and don't cares about the reply + * + * @param cmd The command + * @param print If it should print to System.out + * @throws IOException + */ + private void sendNoReplyCommand(String cmd, boolean print) throws IOException{ + out.println(cmd); + if(print)System.out.println(cmd); + } + + /** + * Reads on line from the command channel + * + * @param print If the method should print the input line + * @return The input line + * @throws IOException if the server returns a error code + */ + private String readCommand(boolean print) throws IOException{ + String tmp = in.readLine(); + if(print)System.out.println(tmp); + if( !parseReturnCode(tmp) ) throw new IOException(tmp); + + return tmp; + } + + /** + * Reads from the server until there are a line with + * only one '.' + * + * @param print To print out the received lines + * @return String with the text + * @throws IOException + */ + private String readMultipleLines(boolean print) throws IOException{ + StringBuffer msg = new StringBuffer(); + String tmp = in.readLine(); + while(!tmp.equals(".")){ + msg.append(tmp); + msg.append('\n'); + tmp = in.readLine(); + if(print)System.out.println(tmp); + } + + return msg.toString(); + } + + + /** + * Parses the return line from the server and returns the status code + * + * @param msg The message from the server + * @return Returns true if return code is OK false if it is ERR + * @throws IOException + */ + private boolean parseReturnCode(String msg){ + int endpos = (msg.indexOf(' ')<0 ? msg.length() : msg.indexOf(' ')); + return msg.substring(0, endpos).equals("+OK"); + } + +//********************************************************************************* + + /** + * All the delete marked messages are unmarkt + * @throws IOException + */ + public void reset() throws IOException{ + sendCommand("RSET", DEBUG); + } + + /** + * All the changes(DELETE) are performed and then the connection is closed + * + * @throws IOException + */ + public void close() throws IOException{ + sendCommand("QUIT", DEBUG); + in.close(); + out.close(); + socket.close(); + } +} diff --git a/src/zutil/network/SMTPClient.java b/src/zutil/network/SMTPClient.java index cf0a76d..7bc9024 100644 --- a/src/zutil/network/SMTPClient.java +++ b/src/zutil/network/SMTPClient.java @@ -17,6 +17,7 @@ import java.util.Date; * */ public class SMTPClient { + public static boolean DEBUG = false; private BufferedReader in; private PrintStream out; @@ -52,13 +53,13 @@ public class SMTPClient { sendCommand("RCPT TO:"+to); sendCommand("DATA"); // The Message - sendNoReplyCommand("Date: "+(new Date()), true); - sendNoReplyCommand("From: "+from, true); - sendNoReplyCommand("To: "+to, true); - sendNoReplyCommand("Subject: "+subj, true); - sendNoReplyCommand(" ", true); - sendNoReplyCommand(msg, true); - sendCommand(".", true); + sendNoReplyCommand("Date: "+(new Date()), DEBUG); + sendNoReplyCommand("From: "+from, DEBUG); + sendNoReplyCommand("To: "+to, DEBUG); + sendNoReplyCommand("Subject: "+subj, DEBUG); + sendNoReplyCommand(" ", DEBUG); + sendNoReplyCommand(msg, DEBUG); + sendCommand(".", DEBUG); close(); }catch(IOException e){ @@ -78,7 +79,7 @@ public class SMTPClient { in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintStream(socket.getOutputStream()); - readCommand(true); + readCommand(DEBUG); sendCommand("HELO "+url); } @@ -90,7 +91,7 @@ public class SMTPClient { * @throws IOException if the cmd fails */ private int sendCommand(String cmd) throws IOException{ - return parseReturnCode(sendCommand(cmd, true)); + return parseReturnCode(sendCommand(cmd, DEBUG)); } /** @@ -145,7 +146,7 @@ public class SMTPClient { } public void close() throws IOException{ - sendCommand("QUIT", true); + sendCommand("QUIT", DEBUG); in.close(); out.close(); socket.close(); diff --git a/src/zutil/network/http/HttpServer.java b/src/zutil/network/http/HttpServer.java index 9365b7c..72a43b0 100644 --- a/src/zutil/network/http/HttpServer.java +++ b/src/zutil/network/http/HttpServer.java @@ -10,10 +10,8 @@ import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; import java.util.HashMap; -import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLServerSocketFactory; import zutil.MultiPrintStream; @@ -131,7 +129,7 @@ public class HttpServer extends Thread{ * * @param certFile The cert file */ - private void registerCertificate(File keyStore, String keyStorePass) throws CertificateException, IOException, KeyStoreException, NoSuchProviderException, NoSuchAlgorithmException{ + protected void registerCertificate(File keyStore, String keyStorePass) throws CertificateException, IOException, KeyStoreException, NoSuchProviderException, NoSuchAlgorithmException{ System.setProperty("javax.net.ssl.keyStore", keyStore.getAbsolutePath()); System.setProperty("javax.net.ssl.keyStorePassword", keyStorePass); }