From a2fb95b7f3e49e9d0d232956e5fcf9244baec9eb Mon Sep 17 00:00:00 2001 From: devoalda Date: Thu, 16 Mar 2023 08:34:33 +0800 Subject: [PATCH] Modified Server to handle connection to filezilla, welcome message and help is now separated --- .gitignore | 170 +++++++++++++++++++++++++++++++++++++++++++++++++++++ client.py | 7 ++- server.py | 20 ++++++- 3 files changed, 193 insertions(+), 4 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..05191e2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,170 @@ +### Example user template template +### Example user template + +# IntelliJ project files +.idea +*.iml +out +gen +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + diff --git a/client.py b/client.py index c3531dc..f4cc0c0 100644 --- a/client.py +++ b/client.py @@ -85,7 +85,10 @@ def handle_UPLD(conn, args): print(response) os.chdir("../") - +def handle_HELP(conn, args): + conn.sendall(f"HELP\r".encode()) + response = conn.recv(BUFFER_SIZE).decode('utf-8') + print(response) def user_input(): # Get user input @@ -133,6 +136,8 @@ def ftp_cient(host, port): elif command.upper() == "RNTO": oldName, newName = args.split(" ", 1) sock.sendall(f"RNTO {oldName} {newName}\r".encode()) + if command.upper() == "HELP": + handle_HELP(sock, args) else: print("Invalid command") diff --git a/server.py b/server.py index 3636963..98f069a 100644 --- a/server.py +++ b/server.py @@ -126,6 +126,20 @@ def handle_pwd(conn, args): def handle_port(conn, args): conn.sendall(b'200 OK\n') +def handle_cwd(conn, args): + directory = os.path.abspath(args[1]) + if not directory.startswith(os.path.abspath(SERVER_FILE)): + conn.sendall(b'550 Permission denied.\n') + return + else: + os.chdir(directory) + conn.sendall(b'200 OK\n') + +def handle_help(conn, args): + conn.sendall(b'\nList of executable commands:\nLIST: List files\nUPLD : ' + b'Upload file\nDWLD : Download file\nDELF : Delete file\nRNTO ' + b': Rename file\nQUIT: Exit') + commands = { 'LIST': handle_list, 'UPLD': handle_upload, @@ -138,13 +152,13 @@ commands = { 'TYPE': lambda conn, args: conn.sendall(b'200 OK\n'), 'PORT': handle_port, 'CDUP': lambda conn, args: conn.sendall(b'200 OK\n'), + 'CWD' : handle_cwd, + 'HELP': handle_help, } def handle_connection(conn): - conn.send(b'220 Welcome to the FTP server.\nList of executable commands:\nLIST: List files\nUPLD : ' - b'Upload file\nDWLD : Download file\nDELF : Delete file\nRNTO ' - b': Rename file\nQUIT: Exit') + conn.sendall(b'220 Welcome to the FTP server.\n') while True: