Python2.7 FTP Server login

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Jörg
User
Beiträge: 2
Registriert: Donnerstag 27. August 2015, 20:21

Hallo,

andref hat auf GitHubGist Simple FTP server, zuletzt in Rev.9, veröffentlicht:
https://gist.github.com/andreif/7766628
Er hat den Server ab der Rev. 7 um login ergänzt.

Ich finde leider nicht heraus wo ich dort Benutzer und Passwort eingeben kann.
Bei allen Versuchen, wenn ich mich mit dem Server verbinde und einlogge, gibt der Server folgendes raus:
error(10049, 'Die angeforderte Adresse ist in diesem Kontext ungültig')

snippet:

Code: Alles auswählen

class Client(object):

    def __init__(self):
        self.session = requests.Session()
        self.username = self.remote_session_id = None

    def csrftoken(self, refresh=True):
        if refresh:
            self.session.get(API_HOST + '/account/login')
        return self.session.cookies['csrftoken']

    def login(self, username, password, ip):
        r = self.session.post(API_HOST + '/account/login', allow_redirects=False, data={
            'username': username, 'password': password, 'csrfmiddlewaretoken': self.csrftoken()})
        self.remote_session_id = r.cookies.get('sessionid')
        self.username = username
        return bool(self.remote_session_id)

    def upload(self, file_name, file_obj):
        r = self.session.post(API_HOST + '/api/ftp', data={'csrfmiddlewaretoken': self.csrftoken()},
                              files={file_name: file_obj})
        return r.content == 'OK'
Oder kann es was anderes als die user/password Eingaben sein?

Die Revisionen bis 6 arbeiten OK.

Gruss
Jörg
Zuletzt geändert von Anonymous am Donnerstag 27. August 2015, 20:33, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Jörg: Die angeforderte Adresse (0.0.0.0) ist in diesem Kontext ja auch ungültig. Der Author scheint mit seinem Client auf irgendeine Art von HTTP-Server zuzugreifen, Du mußt Dir da wahrscheinlich einen eigenen sinnvollen Client schreiben. Allgemein enthält der FTP-Server etliche Programmierfehler. Dass das dann vielleicht irgendwann einmal tut, ist eher Zufall.
Jörg
User
Beiträge: 2
Registriert: Donnerstag 27. August 2015, 20:21

Hallo Sirius3,

danke für die Antwort.
Allgemein enthält der FTP-Server etliche Programmierfehler.
Ist der Code wirklich so schlecht?
Dass das dann vielleicht irgendwann einmal tut, ist eher Zufall.
Wenn du hier den FTP Server meinst, der Arbeitet, und das ist kein Zufall.

In der Revision 6 (noch kein login) startet der Server wie folgt:
// server_ip = '127.0.0.1'
server_port = 2121//

Nach dem Start, falls nicht vorhanden, wird c:\tmp\ftp angelegt (auf Linux /tmp/ftp)
Gibt man jetzt in Firfox ftp://localhost:2121 wird zu dem Server eine Verbindung aufgebaut.
Eine Datei kann man hier nicht herunterladen – Fehler
Ein Schritt zurück zu c:\\tmp - eine Datei kann man hier auch nicht herunter laden – Fehler
Ein Schritt zurück zu c:\\, wenn man jetzt in ein Ordner geht (auch tmp, oder tmp/ftp) kann man Dateien herunter laden – zuversichtlich.

Will man Dateien im LAN von einem anderen Rechner saugen, muss natürlich der Server statt server_ip = '127.0.0.1' eine Netzwerkadresse z.B. '192.168.2.22' haben.

Der Server in Revision 7 startet ebenfalls wie in 6:
// server_ip = '127.0.0.1'
server_port = 2121//

Wie der arbeitet weiss ich nicht, ich kann mich nicht einloggen.
Aber wie der Server arbeitet interessiert mich auch gar nicht.
Ich möchte wissen wie das login hier arbeitet.

Wie man sieht:
class Client(object):
host = 'http://0.0.0.0:8000'

def check_user_password(self, user, password):
print 'Check ' + user
s = requests.Session()
r = s.get(self.host + '/account/login')
c = r.cookies['csrftoken']
r = s.post(self.host + '/account/login', allow_redirects=False,
data={'username': user, 'password': password, 'csrfmiddlewaretoken': c})
return r.cookies.get('sessionid') and True

def get_log(self, user):
r = requests.post(self.host + '/get-log', data={'user': user})
return r.content

def upload(self, user, data):
r = requests.post(self.host + '/prices', data={'user': user, 'data': data})
return r.content == 'OK'
ist der Code wie aus einem Handbuch.
Nur ich finde weder das Handbuch von dem es stammen konnte noch sonst welche Infos darüber.

Ich würde mich freuen wenn jemand mich hier unterstützen könnte.
Gruß
Jörg
BlackJack

@Jörg: Der Login versucht halt sich bei irgendeiner Webanwendung anzumelden. Und man muss dazu den Host angeben auf dem der läuft, denn 0.0.0.0 ist das sicher nicht. Du musst halt herausfinden welche Webanwendung das ist und wo die läuft beziehungsweise selber eine aufsetzen.

Edit: Und der Upload erfolgt auch über diese Webanwendung, also wenn man was hochlädt wird das an die Webanwendung weitergeleitet. Bist Du sicher das macht das was Du willst?

Edit2: Und der Code ist a) wirklich schlecht und b) wenn er funktioniert dann wirklich nur zufällig, denn in der Basisklasse wo die FTP-Kommandos verarbeitet werden wird `recv()` falsch verwendet. Das kann an der Stelle auf die Nase fallen.
Antworten