Added a new POPClient class with SSL support and also added SSL support to HttpServer.Added a DEBUG variable to control the output of FTPClient, POP3Client and SMTPClient.
This commit is contained in:
parent
354c459aa5
commit
2da05b24d5
4 changed files with 343 additions and 25 deletions
|
|
@ -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<String> list = new LinkedList<String>();
|
||||
|
||||
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();
|
||||
|
|
|
|||
317
src/zutil/network/POP3Client.java
Normal file
317
src/zutil/network/POP3Client.java
Normal file
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue