Überschreibsicherung bei doppelten Dateinamen

Support zu den Modifikationen (MODs) von Entwickler OXPUS für das phpBB 3.0.x
MDuss
Beiträge: 149
Registriert: So 30. Dez 2012, 10:26

Überschreibsicherung bei doppelten Dateinamen

Beitrag von MDuss »

Hi Leute.

Mit ist da heute wieder etwas aufgefallen, was ich schon fast vergessen hatte.
Ich habe in der Downloaddatenbank sehr viele Dateien.
Aus bestimmten Gründen kann es dabei passieren, dass ein neuer Eintrag den selben Dateinamen hat, wie ein bereits bestehender Eintrag.
Was ja durch aus passieren kann, je mehr Eintrage man hat. Und es Spielemods mit ähnlichen oder gleichen Dateinamen gibt, aus welchem versehen auch immer.
Wenn jetzt die Umwandlung des Dateinamens vorgenommen wird, dann wird ohne Nachfrage die alte Datei mit der neuen überschrieben, weil ja der alte und der neue Eintrag halt den selben Dateinamen haben.

Könnte man hier bei dem Umbenennungsschritt irgendwie eine Sicherung einbauen?

Z.B. Wenn ein Dateiname schon existiert, dann wird eine Meldung ausgegeben, die neue Datei doch bitte um zu benennen, da es diesen Dateinamen bereits gibt.

Denn ansonsten wird ja überschrieben, und man merkt es unter umständen viel zu spät, um noch etwas retten zu können.

So kann man dann die neue Datei auf dem Server umbenennen und dann wäre das Problem umgangen.

MfG
MDuss
Benutzeravatar
oxpus
Chief handy-man
Beiträge: 2660
Registriert: Do 13. Dez 2007, 23:06
Wohnort: Irgendwo im I-Net
Kontaktdaten:

Re: Überschreibsicherung bei doppelten Dateinamen

Beitrag von oxpus »

Genau das ist bereits berücksichtigt, wenn man die Mod in nicht all zu alter Version einsetzt.
Ist der Download mit dem verschlüsselten Namen bereits vorhanden, wird solange ein neuer Name gesucht, bis dieser nicht als Datei vorhanden ist.
Das klappt in allen Tests erfolgreich, so dass kein Download überschrieben werden sollte. Ausser man gibt das explizit an.

Nachtrag:
Egal, ob die Dateien nun mit dem Original-Dateinamen oder verschlüsselt abgelegt werden, ist die Methode festzustellen, ob die Datei bereits existiert, die gleiche.
Das die Dateinamen verschlüsselt werden, hat mehrere Gründe. Das sind u. a. mögliche Sonderzeichen in den Dateinamen, Verhinderung von Direktdownloads, etc.
Aber dennoch wird immer erst geprüft, ob eine Datei mit dem vorgesehenen Namen eines neuen Downloads, bzw. einer Version davon, bereits in dem Ordner vorhanden ist,
wo die Datei abgelegt werden soll. Erst dann wird auch der generierte Namen verwendet, ansonsten ein neuer Name verwendet.
Das ist auch schon seit längerem in der MOD verankert, um eben doppelte Dateien nicht zu überschreiben, sondern zu behalten.

Voraussetzung für diese Prozesere:
Man hat die Pfadangaben in den Kategorien korrekt gesetzt, die Zugriffsrechte der Ordner, in die abgelegt werden soll, sind korrekt und man lädt nicht selber Dateien hoch, die zufälligerweise den gleichen Dateinamen haben, wie bereits gespeicherte Dateien (ist aber eher unwahrscheinlich, dass man Dateien bereits mit einem Hash-Dateinamen hochlädt) und im ACP einbinden will.
Karsten Ude
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
MDuss
Beiträge: 149
Registriert: So 30. Dez 2012, 10:26

Re: Überschreibsicherung bei doppelten Dateinamen

Beitrag von MDuss »

Hi oxpus.

Dann weiß ich nicht, was bei mir schief gelaufen ist.
Ich hatte mal vor ca. einem Jahr eine Mod hochgeladen (Dateiname als Beispiel: ModA.zip). Ich lade immer die Datei mit FTP hoch und binde diese per ACP ein.
Heute wollte ich eine Mod hochladen, und diese hatte dummerweise den gleichen Dateinamen wie die von vor einem Jahr (also auch ModA.zip).
Da ich ja nur die HAsh5 Werte im FTP Programm sehe, kann ich schwer sagen, ob dieser Dateiname schon mal da war oder nicht.
Dadurch ist ja auch der Hash5 Name identisch zwischen den beiden Dateien.

Und die alte Datei wurde mit der neuen Überschrieben.
Hatte ich dadurch festgestellt, dass ich mit dem FTP Programm später den Ordnerinhalt auf dem Server auf meinen PC Sichern wollte.
Da habe ich dann gesehen, dass trotz der neuen Mod, die Anzahl der Dateien identisch war, obwohl auf dem Server eine mehr hätte sein müssen, als auf meinem PC.

Dann hatte ich durch vergleiche etc. herausgefunden, was schief gelaufen war.

Hatte dann die alte Datei von meiner lokalen Sicherung wieder auf den Server geschoben, und der neuen Datei einen anderen Namen gegeben und neu hochgeladen und eingebunden.

Dann lief es korrekt.

Ich weiß zwar nicht wieso, aber da scheint wohl der Schutz bei mir versagt zu haben.


Welche CHMOD Berechtigung brauchen denn die Ordner und Dateien?
Obwohl das egal sein sollte, die Dateien haben nach den Hochladen den Wert 666 und nach dem umbenennen durch die DL-Mod 777.
Die Ordner, wo die Dateien gespeichert sind haben auch 777.

Also sollte der DL-Manager die erforderlichen rechte haben.

MfG
MDuss

P.S. : Welche Art von Hash5 wird denn berechnet?
Ich meine du sagtest oben, dass bei einer doppelt vorhandenen Datei bei der neuen Datei ein neuer Hash5 Wert errechnet wird.
Aber wie geht das?
Der Dateiname ändert sich ja nicht, und dadurch ja auch der Hash5 nicht. Oder wird dann irgend ein Wert hinzu gerechnet?
Benutzeravatar
oxpus
Chief handy-man
Beiträge: 2660
Registriert: Do 13. Dez 2007, 23:06
Wohnort: Irgendwo im I-Net
Kontaktdaten:

Re: Überschreibsicherung bei doppelten Dateinamen

Beitrag von oxpus »

Der Dateiname wird mit md5() aus dem realen Dateinamen erstellt.
Danach prüft das Script, ob der betreffende errechnete Hash schon im Ordner vorhanden ist, in dem die neue Datei abgelegt werden soll.
Das geschieht mit der php-Funktion file_exists().
Diese Funktion benötigt aber auch unbeschränkten Zugriff auf die Ordner, um die Datei finden zu können, sofern sie existiert.
Welche das sind, hängt von den Einstellungen deines Servers, bzw. Webservers ab. In der Regel sollte CHMOD 0744 für die Ordner reichen,
(werden Ordner über das MOD-eigene Modul "Toolbox" im ACP angelegt, werden diese bereits mit den korrekten Rechten ausgestattet) die
Dateien selber müssen aber CHMOD 0777 haben, um eventuelle Probleme mit dem Kopieren/Verschieben von Dateien über die MOD zu vermeiden.
Und die MOD legt die Dateien letztlich auch mit CHMOD 0777 ab. Zumindest wird das versucht.

Wenn die MOD die Datei mit dem aktuell zu schreibenden Hash findet, wird einfach ein Zähler dem Dateinamen hinzugefügt und der Hash-Wert damit erneut berechnet.
Das ergibt immer einen anderen Hash-Wert, der dann allerdings wiederum erneut geprüft wird.
Und das ganze wiederholt sich solange, bis ein eindeutiger Name gefunden wurde. Erst dann legt die MOD die Datei mit dem dann freien Namen ab.

Wie gesagt: Das funktioniert, nur, wenn der User, mit dem dein PHP physisch auf die Ordner zugreift (in der Regel ist das der gleiche User, der auch den Webserver steuert)
mit file_exists(); die Dateien auch "lesen" kann, um deren Existenz zu prüfen. Ansonsten müsste man ja immer das komplette Verzeichnis auslesen,
um eine Datei auf Existenz zu prüfen, was bei großen Verzeichnissen deutlich länger dauert.
Und nein: Ein bloßes prüfen gegen die Dateibankeinträge in der MOD selber ist zu vage, denn es könnten ja auch Dateien physisch vorhanden sein,
die zwar nicht in die MOD eingebunden sind, aber auch nicht überschrieben werden sollen.
Und es ist dabei auch egal, ob man gegen die realen Dateinamen oder Hash-Namen prüft. Letztlich ist das der Funktion file_exists() egal.

WIe gesagt:
Solange file_exists() die Datei finden kann, wird sie nicht überschrieben, ausser die MOD wird angewiesen, die neue Datei einer bestehenden Version zuzuordnen.
Dann wird die existierende Datei gelöscht und die neue Datei stattdessen in das angegebene Verzeichnis (der gewählten Kategorie) abgelegt.

All dass habe ich mehrfach auf unterschiedlichen Servern getestet und konnte keine Fehler dabei feststellen. Daher sehe ich auch keinen Handlungsbedarf, die
Methode zu ändern (was zwangsweise zu einer längeren Bearbeitungsdauer neuer oder geänderter Downloads führen würde), wenn nicht sicher ist, dass alle anderen
Rahmenbedingungen stimmen.
Karsten Ude
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
MDuss
Beiträge: 149
Registriert: So 30. Dez 2012, 10:26

Re: Überschreibsicherung bei doppelten Dateinamen

Beitrag von MDuss »

Hi oxpus.

Danke für diese ausführliche Erklärung.
Dann bleibt sich für mich die Frage, wo ich ansetzen kann, um zu prüfen, warum es bei mir dann nicht funktioniert.

Wie gesagt, ich lade die Datei mit einem FTP Programm an Ort und stelle, wo sie sein soll.
Dann gehe ich in das ACP und dort trage ich die Datei mit dem menüpunkt "Downloads verwalten" ein.

Mehr mache ich nicht.

Wie kann ich denn prüfen, ob die Funktion file_exists(); die notwendigen rechte hat, wenn es nur an dieser Funktion liegt?
Denn wie gesagt, bei mir wurde die Datei überschrieben, und kein Zähler irgendwo hinzugefügt.
Also scheint die Funktion file_exists(); nicht richtig zu funktionieren.

MfG
MDuss
Benutzeravatar
oxpus
Chief handy-man
Beiträge: 2660
Registriert: Do 13. Dez 2007, 23:06
Wohnort: Irgendwo im I-Net
Kontaktdaten:

Re: Überschreibsicherung bei doppelten Dateinamen

Beitrag von oxpus »

Warum lädst du die Dateien denn nicht über das Upload Formular hoch? Sind es denn riesige Dateien?
Das Formular sorgt dann auch für alles weitere.
Nicht, daß das über deine Methode anders funktionieren würde.
Um zu testen, ob die Funktion korrekt arbeitet, finde diese in der Datei dl_mod/admin/dl_admin_files.php und entferne das @ davor. Das zeigt dann mögliche Php Fehlermeldungen, sofern vorhanden.
Die zweite Möglichkeit wäre, die Ordner für die Dateien auf Chmod 0777 zu setzen.
Ggf. hat aber dein php auch Probleme, wenn die Dateien grösser wären, als php Speicher zur Verfügung steht.
Um alles gezielt zu testen, würde ich an deiner Stelle mal eine neue Kategorie mit einem eigenen Pfad erstellen, dort einen Download erfassen und die gleiche Datei ein zweites Mal als weiteren Download dort einfügen. Wenn alles korrekt eingestellt ist und arbeitet sollten zwei Dateien in dem Ordner zu finden sein
sein, mit unterschiedlichen Hash Namen...
Karsten Ude
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
MDuss
Beiträge: 149
Registriert: So 30. Dez 2012, 10:26

Re: Überschreibsicherung bei doppelten Dateinamen

Beitrag von MDuss »

Hi oxpus.

Ich werde dass heute noch in dem Testforum testen.
Mal sehen, ob es funktioniert.

Ich habe wenige Einträge, die recht groß sind, aber das meiste bewegt sich so um die 25-50MB.
Das mit dem Upload hatte ich mir damals so angewöhnt, und bisher hatte soweit auch alles funktioniert, bis halt das mit dem überschreiben.

Aber ich werde es mal im Testforum prüfen, und sehen was da rauskommt.

MfG
MDuss
MDuss
Beiträge: 149
Registriert: So 30. Dez 2012, 10:26

Re: Überschreibsicherung bei doppelten Dateinamen

Beitrag von MDuss »

HI Nochmals.

Habe eben im Testforum eine separate Kategorie mit eigenem Ordner usw. angelegt und getestet.
Hat aber keinen Unterschied erbracht.

Ich Habe einmal eine Bilddatei eingebunden und beim zweiten mal halt dieselbe nochmal.

Danach auf dem FTP Server nachgesehen, und es war nur eine Datei da.
Der zweite Eintrag hat also den ersten überschrieben.

Auch habe deinen Tipp mit dem entfernen des @ versucht.
Es gibt in der betr. Datei nur eine Zeile, wo dieses file_exists vorkommt.
Das ist Zeile 563

Code: Alles auswählen

while(@file_exists($phpbb_root_path . $config['dl_download_dir'] . $file_path_old . $new_real_file))
Wenn ich hier aber das @ entferne, so dass die Zeile wie folgt lautet:

Code: Alles auswählen

while(file_exists($phpbb_root_path . $config['dl_download_dir'] . $file_path_old . $new_real_file))
Dann erhalte ich einen HTTP 500 Fehler im Browser.

MfG
MDuss
Benutzeravatar
oxpus
Chief handy-man
Beiträge: 2660
Registriert: Do 13. Dez 2007, 23:06
Wohnort: Irgendwo im I-Net
Kontaktdaten:

Re: Überschreibsicherung bei doppelten Dateinamen

Beitrag von oxpus »

Dann stimmen wohl die Pfadangaben in deinen Kategorien nicht.
Schau dir dazu auch die Hilfen an.
Der Fehler zeugt von einem falschen Pfad, der sich aus den einzelnen Variablen zusammensetzt.
Karsten Ude
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
MDuss
Beiträge: 149
Registriert: So 30. Dez 2012, 10:26

Re: Überschreibsicherung bei doppelten Dateinamen

Beitrag von MDuss »

Hi oxpus.

Also die Pfadangaben stimmen.
Und wenn die Pfadangabe nicht stimmen würde, dann bekäme ich ja beim Einbinden der Downloads schon eine Fehlermeldung, dass die Datei am angegebenen Ort nicht existiert.

Da ich aber die Datei ordnungsgemäß einbinden und auch herunterladen kann, muss die Pfadangabe stimmen.

MfG
MDuss
Antworten