![]() |
Clientverwaltung mit idFTPServer
Hallo!
Ich habe vor mir mit dem idFTPServer (Indy 10) einen eigenen FTP Server zu schreiben. Ich habe dazu schon die Demo, von den Indy Demos angesehen und habe auch einen im Grunde lauffähigen Server, sprich die Clients können sich mit Benutzernamen und Passwort anmelden und die ihnen zugewiesenen Verzeichnisse bearbeiten. Mein Problem ist nun die eigentliche Benutzerverwaltung. Wie kann ich die Benutzer so in meinem Programm speichern, dass ich jederzeit Informationen von verscheidenen Clients abrufen, und sie verwalten kann? Ich stelle mir das in etwa so vor, dass ich über die IP (oder ähnliches) einen Client ansprechen kann, Informationen abrufen und zum Beispiel die Verbindung des Clients zum Server unterbrechen kann. Leider habe ich noch keinen richtigen Ansatz, wie ich das Problem angehen kann, denn vor allem das Speichern der verschieden Clients bereitet mir Probleme. Wäre froh um einige Ideen, wie man die Clients verwalten kann. Vielen Dank! Gruß, Lennard |
Re: Clientverwaltung mit idFTPServer
Naja...
Delphi-Quellcode:
Das wär mal ne Architektur, die du dann zum Beispiel in XML speichern könntest.
type
TUser = class(TObject) Name, Passwort: string; Verzeichnis: string; Admin: Boolean; end; TUserConnection = class(TObject) User: TUser; Client: TCustomIPSocket // bzw. das Indy-Gegenstück, das dir sicher übergeben wird procedure CutOff; end; |
Re: Clientverwaltung mit idFTPServer
Das wäre wohl eine gute Lösung, allerdings kann ich immer nur ein Datensatz zur Zeit in das Object schreiben. Da aber nicht immer nur ein Client zur Zeit zum Server verbunden ist, bräuchte ich also eine Methode, um diese Objekte in einer art Array zu speichern, wo ich sie jeder zeit bearbeiten und löschen kann, ist das möglich?
|
Re: Clientverwaltung mit idFTPServer
Hmm...
![]() |
Re: Clientverwaltung mit idFTPServer
Okay, damit wär das Problem ja eigentlich schon so gut wie gelöst. Danke!
eine Frage allerdings noch: Welches ist das Indy Gegenstück zu TCustomIPSocket? |
Re: Clientverwaltung mit idFTPServer
Sorry, das ich pushe... aber hat wirklich keiner eine Ahnung, was ich anstatt "TCustomIPSocket" bei Indy verwenden kann?? Wäre echt super, wenn mir da jemand weiterhelfen könnte.
Gruß, Lennard |
Re: Clientverwaltung mit idFTPServer
Naja, mal sehen... du hast doch beim TIdFTPServer.OnConnect-Ereignis den Peer-Thread. kann man das nicht entsprechend verwerten?
|
Re: Clientverwaltung mit idFTPServer
doch kann man. Der Thread bzw. die Idee ist anschließend bei allen Aktionen die gleiche. Und der Username etc. ist auch darin enthalten. Man kann es also immer über den Thread ansprechen.
|
Re: Clientverwaltung mit idFTPServer
hey,
habe ich das richtig verstanden, dass die AContext Variable aus der Prozedur gemeint ist?
Delphi-Quellcode:
Allerdings ist hier doch nicht der Username gespeichert, oder? Der Username wird doch erst im UserLogin Ereignis übergeben oder nicht?
procedure TForm1.IdFTPServer1Connect(AContext: TIdContext);
Delphi-Quellcode:
procedure TForm1.IdFTPServer1UserLogin(ASender: TIdFTPServerContext;
const AUsername, APassword: string; var AAuthenticated: Boolean); würde mich freuen, wenn mir das jemand nochmal etwas näher bringen könnte :stupid: vielen Dank! Gruß, Lennard |
Re: Clientverwaltung mit idFTPServer
also wenn das so ist, haben wir da grad versionshölle... bei den im BDS 2006 (Pro SSL) mitgelieferten Indys handelt es sich afaik um Indy 10. und da siehts so aus:
Delphi-Quellcode:
Das hab ich jetzt mal aus dem Gedächnis getippt.
procedure TForm1.IdFTPServer1Connect(APeerThread: TIdPeerThread);
begin end; |
Re: Clientverwaltung mit idFTPServer
Zitat:
Wie es aussieht scheint die nachinstallierte Version aber überall so zu sein, wie bei mir, denn ich habe sie nach der ![]() Ist das jetzt ein reines Versionsproblem oder liegt es vielleicht an den unterschiedlichen Delphiversionen? Gruß, Lennard |
Re: Clientverwaltung mit idFTPServer
Also ich hab' Delphi 2006 Prof. mit den vorinstallierten bzw. mitgelieferten Indys.
Und auch dort habe ich nur
Delphi-Quellcode:
AContext : TIdContext
|
Re: Clientverwaltung mit idFTPServer
Kannst du mit dem Context nicht auch arbeiten?
|
Re: Clientverwaltung mit idFTPServer
Nee, nicht wirklich.
|
Re: Clientverwaltung mit idFTPServer
kannst du da nicht was verbindungs-persistentes rausdestillieren? du kannst username und passwort ja extra speichern
|
Re: Clientverwaltung mit idFTPServer
Erst einmal vielen Dank für die Antworten! :)
Ich habe jetzt eine Lösung gefunden. Ich erstellte im OnConnect das TUserConnectioen Objekt und speichere dort den idContext ab dieses Objekt wird in eine TObjectList gespeichert. Da nach dem OnConnect Ereignis vom Client immer das OnUserLogin ausgelöst wird speichere ich dort dann Benutzernamen und Passwort und ein TUser Objekt, das wird dann zum Letzen Item der Liste hinzugefügt. Nun habe ich also alle Informationen zusammen. Bin mir allerdings nicht ganz sicher, ob diese Lösung so ganz wasserdicht ist. Gruß, Lennard |
Re: Clientverwaltung mit idFTPServer
Es währe sehr schön, wenn Du den entsprechenden Code hier posten könntest, dann brauch' ich mich auch nicht weiter damit rumärgern... :thumb:
|
Re: Clientverwaltung mit idFTPServer
Jopp klar, kann ich machen:
Also zum Anfang die beiden benötigten Objekte. Sind so ähnlich wie schon oben gepostet und die TObjectList (ConTnrs).
Delphi-Quellcode:
Als nächstes kommt dann das OnConnect Event dran:
{ ... }
private ClientList: TObjectList; { ... } type TUser = class(TObject) UserName, Password: String; Verzeichnis: String; end; TUserConnection = class(TObject) User: TUser; Context: TIdContext; end;
Delphi-Quellcode:
Hier wird also einfach nur das UserConnection Objekt erstellt und idContext gepeichert. der Wert User bleibt erstmal leer, denn die Informationen werden erst im OnUserLogin übergeben. Zum Schluss wird das neue Objekt dann noch in die Liste (ClientList) eingetragen, damit man weiterhin drauf zugreifen kann.
procedure TForm1.IdFTPServer1Connect(AContext: TIdContext);
var UserConnection: TUserConnection; begin UserConnection:= TUserConnection.Create; UserConnection.User:= nil; UserConnection.Context:= AContext; ClientList.Add(UserConnection); end; Nun haben wir den Client schon mal erfasst und brauchen jetzt noch die Benutzerinformationen, die im OnUserLogin Event übergeben werden:
Delphi-Quellcode:
UserInList ist einfach eine Funtion, die überprüft, ob der Benutzer sich überhaupt einloggen darf. Gibt sie true zurück, wird der Benutzer zugelassen (AAuthenticated:= true; ) und das UserObjekt, welches noch fehlt erstellt. Da das OnUserLogin immer nach dem OnConnect aufgerufen wird wissen wir ja, dass der neue Client, der sich jetzt anmelden will der letzte ist, der in der Liste eingetragen ist. Also rufen wir den letzten Eintrag der Liste als TUserConnection auf und geben ihm den gerade angelegten User. Somit haben wir alle Informationen für den User zusammen und können ihn über den Username oder idContext verwalten. Wenn der Benutzer nicht bekannt ist wird ihm der Login einfach verweigert, und er wird aus der Liste gelöscht.
procedure TForm1.IdFTPServer1UserLogin(ASender: TIdFTPServerContext;
const AUsername, APassword: string; var AAuthenticated: Boolean); var User: TUser; begin if UserInList(AUsername, APassword) then begin AAuthenticated:= true; User:= TUser.Create; User.UserName:= AUsername; User.Password:= APassword; User.Verzeichnis:= 'C:\Test'; (ClientList.Items[ClientList.Count - 1] as TUserConnection).User:= User; end else begin AAuthenticated:= false; ClientList.Delete(ClientList.Count - 1); end; end; Als letztes dann noch das OnDisconnect Event:
Delphi-Quellcode:
Tja, hier wird einfach nur die Liste der Clients durchgegangen und nachgeschaut welcher Client sich gerade verabschiedet hat, der wird dann einfach gelöscht. Der Client wird über den idContext gefunden, da es hier ja den Benutzernamen nicht gibt.
procedure TForm1.IdFTPServer1Disconnect(AContext: TIdContext);
var scan: Integer; begin for scan:= ClientList.Count - 1 downto 0 do begin if (ClientList.Items[0] as TUserConnection).Context = AContext then begin ClientList.Delete(scan); end; end; end; So, das ist mein Grundgerüst der Clientverwaltung. Ist eigentlich nichts besonderes, und wie gesagt ich bin mir nicht ganz sicher, ob das so ganz wasserdicht ist, denn da die Informationen in in 2 verschiedenen Events gesammelt werden könnte es sein, dass dort mal falsche Informationen eingetragen werden, wenn mehrere Clients auf einmal zum Server verbinden und sich die Events überschneiden sollten. Gruß, Lennard |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz