Serwer FTP - problem z uwierzytelnieniem

0

Witajcie

Jak po temacie można łatwo rozpoznać, podczas pracy nad prostym serwerem FTP pojawił się problem związany z uwierzytelnieniem. W trakcie pisania serwera korzystałem z modułu pyftpdlib i jego dokumentacji. (http://pyftpdlib.readthedocs.io/en/latest/) Co do klienta to pisałem go w interaktywnym interpreterze używając oczywiście standardowego modułu ftplib i korzystałem z jego dokumentacji. (https://docs.python.org/2/library/ftplib.html)

Oto kod serwera:

import os

from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer

# Wirtualna tabela uzytkownikow serwera, 1 uzytkownik to admin ze wszelkimi prawami
# 2 uzytkownik to uzytkownik anonimowy, ktory posiada tylko katalog roboczy i ma prawa tylko do odczytu

authorizer = DummyAuthorizer()
authorizer.add_user('test', password='test', homedir='.', perm='elradfmwMT')
authorizer.add_anonymous(os.getcwd())

# Handler sluzy do kontroli laczenia sie z serwerem, jest interpreterem protokolu FTP

handler = FTPHandler
handler.banner = 'Connects to the server'

# Nasluchuj polaczenia od jakiegokolwiek hosta na porcie 21
address = ('', 21)
server = FTPServer(address, handler)

server.max_cons = 150
server.max_cons_per_ip = 10

# Rozpocznij prace serwera FTP (petla asynchroniczna)
server.serve_forever()

Poniższy kod to próba zalogowania się do serwera FTP z poziomu klienta. Tutaj występuje problem:

>>> ftp=FTP()
>>> ftp.connect('127.0.0.1')
'220 Connecting to the server...'
>>> ftp.sendcmd('USER test')
'331 Username ok, send password.'
>>> ftp.sendcmd('PASS test')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/ftplib.py", line 249, in sendcmd
    return self.getresp()
  File "/usr/lib/python2.7/ftplib.py", line 224, in getresp
    raise error_perm, resp
ftplib.error_perm: 530 Authentication failed.
>>> ftp.login()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/ftplib.py", line 393, in login
    if resp[0] == '3': resp = self.sendcmd('PASS ' + passwd)
  File "/usr/lib/python2.7/ftplib.py", line 249, in sendcmd
    return self.getresp()
  File "/usr/lib/python2.7/ftplib.py", line 224, in getresp
    raise error_perm, resp
ftplib.error_perm: 530 Anonymous access not allowed.
>>> 

W przypadku

ftp.login('test', 'test')

wyrzucany jest wyjątek o takiej treści: **ftplib.error_perm: 530 Authentication failed.
**

Ciekawa sprawa występuje w przypadku użycia metody ftp.sendcmd(), otóż:

>>> ftp.sendcmd('USER test')
'331 Username ok, send password.'
>>> ftp.sendcmd('PASS test')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/ftplib.py", line 249, in sendcmd
    return self.getresp()
  File "/usr/lib/python2.7/ftplib.py", line 224, in getresp
    raise error_perm, resp
ftplib.error_perm: 530 Authentication failed.

Serwer przyjmuje komendę USER test jako prawdziwą, natomiast PASS test (hasło jest takie samo jak login) już odrzuca twierdząc, że jest fałszem.

Byłbym wdzięczny za pomoc w rozwiązaniu problemu.

1

Problem został przeze mnie rozwiązany. Często bywało tak, że tematy były puste kiedy szukałem rozwiązania na forum jakiegoś problemu więc odpowiem sam sobie na post w celu ewentualnej pomocy innym. Może ktoś będzie miał akurat podobny problem i będzie miał rozwiązanie. :)

Otóż problem leżał dokładnie w tej części kodu serwera:

# Handler sluzy do kontroli laczenia sie z serwerem, jest interpreterem protokolu FTP
 
handler = FTPHandler
handler.banner = 'Connects to the server'

Z racji, że handler jest procedurą obsługi połączenia z serwerem, należy również z obiektem handler wywołać metodę authorizer i również w tym miejscu zaznaczyć autoryzatora serwera. (czyli użytkownika, który zawarty jest w tabeli użytkowników serwera zdefiniowanej powyżej) Należy więc dodać taką linię kodu:

handler.authorizer = authorizer

Po przypisaniu autoryzatora do "kontrolera połączeń" nie powinien już występować problem z poprawnym zalogowaniem się na serwer.

1 użytkowników online, w tym zalogowanych: 0, gości: 1