diff --git a/src/pom.xml b/src/pom.xml index 48e0cc603429eb52f88f7e118308374ae767394f..76346e117d37e388a58b793bbaf4e5daeb73341a 100755 --- a/src/pom.xml +++ b/src/pom.xml @@ -51,6 +51,15 @@ <plugin> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> + <configuration> + <archive> + <manifest> + <addClasspath>true</addClasspath> + <classpathPrefix>lib/</classpathPrefix> + <mainClass>com.theophilecosse.App</mainClass> + </manifest> + </archive> + </configuration> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> diff --git a/src/server.py b/src/server.py new file mode 100644 index 0000000000000000000000000000000000000000..461c25ddcbcf396eeebc0a610afad3444415869c --- /dev/null +++ b/src/server.py @@ -0,0 +1,42 @@ +import os +import logging +from pyftpdlib.authorizers import DummyAuthorizer +from pyftpdlib.handlers import FTPHandler +from pyftpdlib.servers import FTPServer + +def main(): + # Instantiate a dummy authorizer for managing 'virtual' users + authorizer = DummyAuthorizer() + + # Define a new user having full r/w permissions and a read-only + # anonymous user + authorizer.add_user('theophile', 'pw12345', '/home/theophile', perm='elradfmwMT') + authorizer.add_anonymous('/home/theophile/tmpdir') + + logging.basicConfig(level=logging.DEBUG) + + # Instantiate FTP handler class + handler = FTPHandler + handler.authorizer = authorizer + + # Define a customized banner (string returned when client connects) + handler.banner = "Test server ftp" + + # Specify a masquerade address and the range of ports to use for + # passive connections. Decomment in case you're behind a NAT. + #handler.masquerade_address = '151.25.42.11' + #handler.passive_ports = range(60000, 65535) + + # Instantiate FTP server class and listen on 0.0.0.0:2121 + address = ('', 21212) + server = FTPServer(address, handler) + + # set a limit for connections + server.max_cons = 256 + server.max_cons_per_ip = 5 + + # start ftp server + server.serve_forever() + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/src/server.sh b/src/server.sh new file mode 100755 index 0000000000000000000000000000000000000000..b8ce94956a813f5919079c99d20c18181b52a311 --- /dev/null +++ b/src/server.sh @@ -0,0 +1 @@ +python3 -m pyftpdlib -u theophile -P testmdp -p 21212 -D \ No newline at end of file diff --git a/src/src/main/java/com/theophilecosse/App.java b/src/src/main/java/com/theophilecosse/App.java index 95b1e664f7fb49a5985ce7d9aef741e155f4268e..ad52f5ab2e6a8adc09d48131386061912544fba2 100644 --- a/src/src/main/java/com/theophilecosse/App.java +++ b/src/src/main/java/com/theophilecosse/App.java @@ -1,13 +1,25 @@ package com.theophilecosse; +import java.io.IOException; + +import com.theophilecosse.client.FTPClient; + /** * Hello world! * */ -public class App -{ - public static void main( String[] args ) - { - System.out.println( "Hello World!" ); +public class App { + public static void main(String[] args) { + System.out.println(args[0] + "|" + args[1] + "|" + args[2] + "|" + args[3]); + try { + FTPClient ftpClient = new FTPClient(args[0], Integer.parseInt(args[1])); + + ftpClient.login(args[2], args[3]); + ftpClient.setPort(); + ftpClient.list(); + } catch (IOException e) { + e.printStackTrace(); + System.out.println("unable to create FTP Client"); + } } } diff --git a/src/src/main/java/com/theophilecosse/client/FTPClient.java b/src/src/main/java/com/theophilecosse/client/FTPClient.java index 8d85f66179450e83cf2bf94bd312fd853fb2a3c4..933e6de40d5385d74aeac504cc1a4b1034b44955 100644 --- a/src/src/main/java/com/theophilecosse/client/FTPClient.java +++ b/src/src/main/java/com/theophilecosse/client/FTPClient.java @@ -1,14 +1,115 @@ package com.theophilecosse.client; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.ServerSocket; +import java.net.Socket; + /** * FTPClient */ public class FTPClient { - private String ip; + private int port; + + private boolean isDataChannelOpen; + + private Socket controlSocket; + private PrintWriter controlWriter; + private BufferedReader controlReader; + private ServerSocket serverDataSocket; + private Socket dataSocket; + private PrintWriter dataWriter; + private BufferedReader dataReader; + + public FTPClient(String ip, int port) throws IOException { + isDataChannelOpen = false; + this.port = port; + controlSocket = new Socket(ip, port); + controlWriter = new PrintWriter(controlSocket.getOutputStream(), true); + controlReader = new BufferedReader(new InputStreamReader(controlSocket.getInputStream())); + serverDataSocket = new ServerSocket(21210); + } + public void openDataChannel() throws IOException { + dataSocket = serverDataSocket.accept(); + dataWriter = new PrintWriter(dataSocket.getOutputStream(), true); + dataReader = new BufferedReader(new InputStreamReader(dataSocket.getInputStream())); + } + + public void setPort() throws IOException { + this.sendCommand("PORT","127,0,0,1,82,218"); + } + + public void list() throws IOException { + System.out.println("before sending list"); + this.sendCommand("NLST"); + System.out.println("list sent"); + if (!isDataChannelOpen){ + openDataChannel(); + } + System.out.println("dataConnection Done"); + System.out.println(readDataUntilCRLF()); + System.out.println("dataRead done"); + System.out.println(controlReader.readLine()); + System.out.println("controle read done"); + } + + public String readDataUntilCRLF() throws IOException { + char CR='a'; + char LF='a'; + int lineCount = 0; + StringBuilder stringBuilder = new StringBuilder(); + do { + if ((lineCount % 2) == 0){ + CR = (char) dataReader.read(); + stringBuilder.append(CR); + } else { + LF = (char) dataReader.read(); + stringBuilder.append(CR); + } + lineCount += 1; + + } while (!(CR=='\r' && LF=='\n')); + //stringBuilder.setLength(stringBuilder.length()); + return stringBuilder.toString(); + } + + public void sendCommand(String command,String... arguments){ + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(command); + for (String argument : arguments) { + stringBuilder.append(' '); + stringBuilder.append(argument); + } + stringBuilder.append("\r\n"); + controlWriter.print(stringBuilder.toString()); + controlWriter.flush(); + } + + + + public void login(String username) throws IOException { + this.sendCommand("USER",username); + System.out.println(controlReader.readLine()); + } + + public void login(String username, String password) throws IOException { + this.sendCommand("USER",username); + System.out.println(controlReader.readLine()); + this.sendCommand("PASS",password); + System.out.println(controlReader.readLine()); + } + + public void closeConnection() { + try { + dataSocket.close(); + controlSocket.close(); + } catch (IOException e) { - public FTPClient(String ip){ - this.ip = ip; + e.printStackTrace(); + } } } \ No newline at end of file