wahsaga: Regelwerk für Dateirechte aufbauen/interpretieren

Hi Folks,

ich suche eine möglichst ressourcenschonende Möglichkeit, folgende Aufgabe zu lösen:
In einem PHP-Script möchte ich für die Inhalte eines Verzeichnisbaumes Rechte hinterlegen, ob die einzelnen Dateien dem User angezeigt werden dürfen oder nicht.
Dabei soll die Rechtevergabe natürlich nicht für jede einzelnen Datei erfolgen müssen, sondern es sollen auch Muster möglich sein - nur recht simple, also bspw. * und ?, wie man sie als Wildcards überlicher Dateisystemimplementierungen kennt.
Also soll mit "*.htm" ein Recht für alle Dateien mit der Endung .htm gesetzt werden können, analog soll "hallo*" alle Dateien erwischen, deren Name mit "hallo" beginnt. Und für die Ordner sollen die Wildcards ebenfalls gelten, also "/ordner1/ordner?/xyz.*" soll innerhalb von "ordner1" und darunter in allen Ordnern, deren Name aus "ordner" plus einem beliebigen Zeichen bestehen, alle Dateien mit dem Namen "xyz" und beliebiger Endung matchen - Prinzip sollte klar sein.
Zum Überprüfen, ob ein Pfad-Dateiname-String auf ein Muster passt, käme ggf. fnmatch() in Frage, bzw. das simple Umschreiben solcher Muster in reguläre Ausdrücke.

Jetzt stehe ich aber vor der Frage, wie ich bei so einem System konkurrierende Regeln vernünftig priorisiert bekomme.
Eine "voll qualifizierte" Regel, bspw. für "/ordner1/ordnerA/Datei.xyz", soll natürlich "stärker" sein, als eine dazu konkurrierende "/ordner1/ordner?/*.xyz", die ggf. zum Erlauben/Verbieten eine andere Aussage macht.
Aber was ist, wenn ich jetzt Testen möchte, ob "ordner1/ordnerA/blah.txt" angezeigt werden darf - und zwei Regeln
"/ordner1/ordner?/blah.txt" - erlaubt
"/ordner1/o?dnerA/blah.txt" - verboten
existieren, die beide zutreffen, aber zu unterschiedlichen Aussagen kommen?

Die Regeln müssten also irgendwie sortiert werden - nur nach welchem Kriterium?
Zuerst sollten natürlich die erwähnten voll qualifizierten Regeln drankommen, und danach die "weicheren", die Wildcards enthalten. Sobald ich dann eine passende Regel gefunden habe, soll die Suche abgebrochen werden.

Ich bin mir noch nicht sicher, wie ich die Regeln ablegen soll - ein Array, bestehend aus Strings, die jeweils eine Regel enthalten?
Oder vielleicht doch lieber ein mehrdimensionales Array, in dem ich dann für jeden "Ordner"-Bestandteil einer Regel eine Ebene nutze?
Also so in der Art:

  
Array  
(  
    ['ordner1'] => Array  
        (  
            ['ordner?'] => Array  
                (  
                    ['voller.name'] => 1  
                    ['xyz.*'] => 1  
                    ['*.php'] => 0  
                )  
        )  
)  

Da würde ich dann, wenn ich "/ordner1/ordnerA/blah.php" untersuchen möchte, dieses am Verzeichnistrennzeichen / aufsplitten, und dann zunächst schauen, ob das Array auf erster Ebene einen/mehrere passende Einträge für ""ordner1" enthält. Anschließend würde unterhalb dieser Zweige weiter gesucht, was auf "ordnerA" passt, etc.

Problem dabei: Wie lege ich darin sinnvoll eine Regel für Dateien namens "*.txt" ab, die für _alle_ Verzeichnistiefen gültigkeit haben soll?

  
Array  
(  
    ['*'] => Array  // beliebiger Ordnername  
        (  
            ['*.txt'] => 1  
        )  
)  

Und wie würde ich so etwas sinnvoll parsen, wenn nicht nur "/ordner1/xyz.txt", sondern auch "/ordner1/ordnerA/blah.txt" von dieser Regel erfasst werden soll? Am '*' eine Schleife drehen, und auf dieser Arrayebene für das nächste Unterverzeichnis erneut prüfen?
Dann müsste ich bei einer Regel

  
Array  
(  
    ['ordner*'] => Array  
        (  
            ['*.txt'] => 1  
        )  
)  

aber eigentlich auch hier eine Schleife einlegen, weil die auf "/ordner1/blah.txt" genauso passen könnte wie auf "/ordner1/ordnerA/blubb.txt".

Hm, nein, ich glaube da verrenne ich mich mit dieser Array-Ebenen-Geschichte in unpraktikable Gefilde - oder ...?

Da wäre ein eindimensionales Array, in dem ich Regelmuster á la
"/ordner1/*/*.txt"
"*.txt"
"*A/*.txt"
ablege, vermutlich doch geeigneter.

Aber die Priorisierungsfrage bleibt bestehen.
Ich könnte zunächst mal Regeln, die nur aus nicht-Wildcardzeichen bestehen, nach oben sortieren.
Regeln mit Wildcards werden dann danach priorisiert, an welcher Stelle das Wildcardzeichen auftaucht ...
Aber auch das erscheint mir noch zu unspezifisch, um eine Sortierung des Regelwerks hinzubekommen, die möglichst eindeutig ausfällt, und wenig bis keine Zweifelsfälle hinterlässt.

Klar, wenn ich mir vorher die Reihenfolge der Regeln überlegen würde, wäre das ganze Problem kaum existent.
Aber die Regeln sollen nachher durch einen Benutzer administriert werden - d.h., ich würde nur Regelmuster als Texteingabe bekommen, und möchte diese in mein Regelwerk einbauen.

Oder kann ich es dem Admin-Nutzer zumuten, eine Priorisierung seiner Regeln selber vorzunehmen? Bspw. Regeleingabe über eine Textarea, eine Regel pro Zeile, weiter oben = höhere Priorität. Wer zuerst kommt, mahlt zuerst ...

Wer sich über soetwas auch schon mal den Kopf zerbrochen hat, möge sich ermutigt fühlen, mich mit seinen Gedankengängen zu diesem Thema zu erheitern.

Gruß,
wahsaga

--
/voodoo.css:
#GeorgeWBush { position:absolute; bottom:-6ft; }
  1. Hallo Wahsaga,

    da solltest Du Dich mal it den NDS (Novell Directory Services)beschäftigen. Es gibt mMn keine bessere Umsetzung für Datei- und Objektrechte.

    Man muss schließlich auch berücksichtigen, was in Verzeichnissen uns Unterverzeiochnissen geschieht, ob Rechte vererbt oder die Vererbung unterbrochen werden soll und/oder für einzelne Ressourcen Sonderbestimmungen bestehen. Und dann wird es spannend, WER denn welche Rechte verwalten, sehen, kontrollieren und ändern darf...

    Ist ein weites Feld.

    LG
    Chris

    1. Hallo

      Ist ein weites Feld.

      und der Problemstellung, wie von wahsaga formuliert:

      ich suche eine möglichst ressourcenschonende Möglichkeit

      absolut nicht angemessen.

      Freundliche Grüße

      Vinzenz

      1. Hallo,

        Ist ein weites Feld.

        und der Problemstellung, wie von wahsaga formuliert:

        ich suche eine möglichst ressourcenschonende Möglichkeit

        absolut nicht angemessen.

        Was bringt Dich zu der Aussage?

        Kennst Du die NDS?
        Kennst Du andere Rechtesysteme?
        ...

        Hast Du schon mal selber welche aufgebaut, die ähnlich komplex, wie die von Wahsaga gewünschten sind?
        ...

        Wäre nett, wenn Du dann etwas substantiierter antworten könntest.

        LG
        Chris

        1. hi,

          Hast Du schon mal selber welche aufgebaut, die ähnlich komplex, wie die von Wahsaga gewünschten sind?

          Wie im anderen Antwortposting beschrieben, es geht nicht wirklich um Zugriffsrechte, sondern mehr um das Setzen eines "hidden"-Flags, so das bestimmte Dateien beim browsen durch Verzeichnisse nicht gelistet werden.
          Nur will ich eben nicht wirklich ein solches Attribut für jede einzelne Datei setzen müssen, sondern ein Regelwerk aufbauen, das auf Grund von String- bzw. Mustervergleichen entscheiden lässt, ob eine Datei "sichtbar" ist, oder nicht.
          Und wie gesagt, dies nicht auf Dateisystemebene, sondern beim Listen von Verzeichnisinhalten über HTTP.

          Wäre nett, wenn Du dann etwas substantiierter antworten könntest.

          Nicht streiten, Kinderchen ;-)

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. ReHi,

            Nicht streiten, Kinderchen ;-)

            Nee, ist nur eine Aufforderung zur konkreten Äußerung :-)

            Ich hab solche Systeme schon öfter für Kunden gebaut, und nachher habe ich mich meistens geärgert, dass ich nicht gleich den großen Hammer benutzt hatte. Der kleine rächt sich irgendwann immer.

            Generell

            - Bereichseinschränkung
              + Gruppenerlaubnis
              - Gruppenverbot
              + Einzelerlaubnis
              - Einzelverbot

            hat sich bewährt.

            Wahrscheinlich willst Du auch nicht wirklich so doof wie M$ vorgehen, und eine riesige DB aufbauen, in der für jede User-Ressourcen-Verknüpfung ein Datensatz angelegt werden muss?!?

            LG
            Chris

            1. hi,

              Generell

              - Bereichseinschränkung
                + Gruppenerlaubnis
                - Gruppenverbot
                + Einzelerlaubnis
                - Einzelverbot

              hat sich bewährt.

              Ja, so in etwa.

              Allerdings möchte ich wenn möglich die "Reihenfolge" von Erlaubnis und Verbot flexibel halten.
              Natürlich muss geklärt werden, ob gilt "was nicht verboten ist, ist erlaubt" - oder umgekehrt.
              Wenn möglich wollte ich diese Entscheidung aber auch dem administrierenden Nutzer überlassen.

              Wenn sehr viele Dateien vorhanden sind, von denen nur recht wenige "gesehen" werden können sollen - dann sollte es ein generelles Verbot geben, mit ein paar Ausnahmen.

              Wenn von sehr vielen Dateien fast alle sichtbar sein sollen - dann wäre es eine generelle Erlaubnis, mit ein paar kleinen Einschränkungen.

              Vielleicht sollte ich mir die Arbeit da leichter machen, und administrativ nur festlegen lassen, ob _generell_ verboten oder erlaubt gilt - und dann noch die dazu jeweils gegenteilig lautenden Ausnahmen.
              Damit wäre das Problem der Priorisierung widersprüchlicher Regeln eigentlich schon gelöst - ein wenig zu Ungunsten des administrativen Komforts halt.

              Wahrscheinlich willst Du auch nicht wirklich so doof wie M$ vorgehen, und eine riesige DB aufbauen, in der für jede User-Ressourcen-Verknüpfung ein Datensatz angelegt werden muss?!?

              Wenn diese Triviallösung mich zufriedenstellen würde, hätte ich den Thread nicht eröffnen brauchen :-)

              gruß,
              wahsaga

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
        2. Hallo Chris,

          Ist ein weites Feld.
          und der Problemstellung, wie von wahsaga formuliert:

          ich suche eine möglichst ressourcenschonende Möglichkeit
          absolut nicht angemessen.

          Was bringt Dich zu der Aussage?

          Kennst Du die NDS?

          Ja, ich kenne die NDS; bereits seit Novell 4.10. Die NDS sind nicht ressourcenschonend und waren dies noch nie. Die NDS sind komplex. Ich gehe mal davon aus, dass wahsaga kein LDAP implementieren will. Es soll _einfach_ sein.

          Kennst Du andere Rechtesysteme?

          Ja, z.B. die Rechtesysteme von VMS, die der Unix-artigen Systeme, ActiveDirectory, Rechtesysteme diverser DBMS.

          Hast Du schon mal selber welche aufgebaut, die ähnlich komplex, wie die von Wahsaga gewünschten sind?

          Ein eigenes Rechtesystem? Nein, dazu bestand noch nie eine Notwendigkeit. Grundsätzlich sollte man sich an das KISS-Prinzip halten.

          Wäre nett, wenn Du dann etwas substantiierter antworten könntest.

          *g*

          wahsaga könnte sich z.B. was von Microsoft abschauen:
          Eine Verweigerung kann nicht durch noch soviele und direkte Berechtigungen außer Kraft gesetzt werden, ansonsten addieren sich einzelne Berechtigungen. Das ist ein relativ einfaches Grundprinzip.

          Freundliche Grüße

          Vinzenz

          1. Hallo Vinzenz,

            Ein eigenes Rechtesystem? Nein, dazu bestand noch nie eine Notwendigkeit. Grundsätzlich sollte man sich an das KISS-Prinzip halten.

            Dass das hier noch einer kennt *tztz* :-)

            Das alte System von M$ ist aber wesentlich unintelligenter, als das von Novell. Darum habe sie schließlich für das "active Directory" die Lizenz von Novell für die NDS aufgenommen. Die beiden sind intern fast baugleich.

            Die wesentliche Frage für Wahsaga sollte sein, ob er Gruppenbildung als positiv empfinden würde.

            Außerdem muss er sich noch äußern, ob Rechte nur an Mustern festgemacht werden sollen, oder auch an Verzeichnissen und/oder Ressourcen direkt.

            LG
            Chris

            1. hi,

              Die wesentliche Frage für Wahsaga sollte sein, ob er Gruppenbildung als positiv empfinden würde.

              Ja, auf jeden Fall.

              Außerdem muss er sich noch äußern, ob Rechte nur an Mustern festgemacht werden sollen, oder auch an Verzeichnissen und/oder Ressourcen direkt.

              Auch einen voll qualifizierten Pfad/Dateiname wollte ich als "Muster" betrachten - eines, das eben keine Wildcards enthält, und deshalb nur auf genau eine einzige Datei im Verzeichnisbaum zutreffen kann.

              Ob ich hierfür einfach als Holzhammer ebenfalls preg_match zum "suchen" verwende, oder aber einen einfachen Stringvergleich, ist eine mir derzeit noch nicht so wichtige Detailfrage.
              preg_replace wäre dafür zwar eigentlich zu hoch gegriffen - aber dafür kann ich dann die Datenstruktur ggf. einfacher halten, muss nicht so genau zwischen "Suchmustern" und _exaktem_ Pfad/Dateiname-String unterscheiden.

              Bereits hier aber eindeutig zu unterscheiden, und zuerst mal nur auf diese voll qualifizierten, nur auf genau eine Datei zutreffen könnenden Strings zu prüfen, und erst anschließend Mustervergleiche mit Wildcards durchzuführen, war mein anderer Gedanke.
              Damit wäre zumindest schon mal eine klare Priorität zwischen voll qualifizierter Regel und Mustersuche gegeben - voll qualifiziert "sticht" natürlich alles andere.

              gruß,
              wahsaga

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
              1. hi,

                Die wesentliche Frage für Wahsaga sollte sein, ob er Gruppenbildung als positiv empfinden würde.

                Ja, auf jeden Fall.

                Moment, jetzt muss ich doch erst mal überlegen, ob ich die Frage richtig verstanden habe.

                Verschiedene Rechte für verschiedene (Betrachter-)Benuztergruppen soll es nicht geben.

                Rechte für Datei_gruppen_ sollen aber vergeben werden können - mit einer Regel, die im Dateinamen oder auch schon davor irgendwo in dem/den Verzeichnisnamen Wildcards enthält.

                gruß,
                wahsaga

                --
                /voodoo.css:
                #GeorgeWBush { position:absolute; bottom:-6ft; }
              2. Hallo Wahsaga,

                Auch einen voll qualifizierten Pfad/Dateiname wollte ich als "Muster" betrachten - eines, das eben keine Wildcards enthält, und deshalb nur auf genau eine einzige Datei im Verzeichnisbaum zutreffen kann.

                Nicht das "Auch" ist das Problem, sondern das "Oder".

                Welches Recht soll überwiegen?

                • Auf ein Verzeichnis _nicht_ zugreifen zu dürfen
                • auf eine _vorhandene_ Ressource in dem eigentlich gesperrten
                    Verzeichnis doch zugreifen zu dürfen
                • auf ein Muster zugreifen zu dürfen, dessen passende Ressource
                    zum Zeitpunkt der Mustererlaubnis noch gar nicht existiert hat?

                ...

                Die Geschichte mit Mustererlaubnissen innerhalb qualifizierter Verzeichnisse hat mir bei NDS immer gefehlt.

                Einfaches Beispiel:
                User A hat das Scanrecht für alle Dateien im Ordner "Besuchsberichte".
                Er hat aber keine leseerlaubnis für diese Berichte, auch keine Löscherlaubnis.
                Er soll aber die Erlaubnis haben, seine eigenen Dateien ansehen zu dürfen, und die (temporäre) Erlaubnis, seine Dateie eines bestimmten Namensmusters (nämlich seine nächsten Monatsberichte) bis fünf Tage nach dem Anlagedatum noch ändern zu dürfen.

                Solange diese Dateien aber noch nicht existieren, kann man in den NDS auch keine Rechte darauf vergeben. Das wäre mit Muster-Rechten möglich. Alle anderen Beschreibungen hier dienen freilich nur der Anschaulichkeit...

                LG
                Chris

                1. hi,

                  Welches Recht soll überwiegen?

                  Das ist eigentlich meine Kernfrage.
                  Dass ich diese selber beantworten muss, ist mir klar - und wie, dachte ich eigentlich auch schon dargelegt zu haben.

                  Nochmal, zu den folgenden Punkten: Es geht _nicht_ um Zugriffrechte, sondern nur darum, ob eine Datei dem Nutzer im Verzeichnislisting als vorhanden _angezeigt_ werden soll, oder nicht.
                  Dies soll den _direkten_ Zugriff auf die Datei nicht einschränken/unterbinden, wenn dem Nutzer der Dateiname sowieso bekannt ist.

                  Es geht mir eigentlich nur darum, den "autoindex"-Mechanismus eines Webservers ein bisschen aufzubohren.
                  Wenn mir ein normal konfigurierter Webserver beim Zugriff auf /ordner/ das Directory Listing verweigert, heißt das ja auch nicht (automatisch), dass ich über HTTP /ordner1/datei.xyz nicht abrufen könnte.

                  • Auf ein Verzeichnis _nicht_ zugreifen zu dürfen
                  • auf eine _vorhandene_ Ressource in dem eigentlich gesperrten
                      Verzeichnis doch zugreifen zu dürfen

                  Wenn der Nutzer das Verzeichnis nicht gelistet bekommen soll, soll er natürlich auch keine darin liegenden Dateien gelistet bekommen.

                  • auf ein Muster zugreifen zu dürfen, dessen passende Ressource
                      zum Zeitpunkt der Mustererlaubnis noch gar nicht existiert hat?

                  Um diesen Aspekt wollte ich mich nicht kümmern.
                  Wenn adimistrativ eine Regel erstellt wird, die für alle *.php-Dateien im Verzeichnis das Auflisten erlaubt - dann soll diese Regel auch für eine neu dazukommende .php-Datei gelten.
                  Diese erst noch "freischalten" zu lassen, habe ich nicht vorgesehen.

                  Solange diese Dateien aber noch nicht existieren, kann man in den NDS auch keine Rechte darauf vergeben. Das wäre mit Muster-Rechten möglich.

                  Darum geht es mir nur sekundär.
                  Mir geht es vor allem darum, mit einem Muster Verbot/Erlaubnis für mehrere betroffene Dateien auf einmal vergeben zu können, ohne es für jede einzelne Datei tun zu müssen.
                  Ob eine Datei zum Zeitpunkt der Regelerstellung schon existiert oder nicht, ist für mich unwichtig. Zu beachten, dass seine Muster auch später hinzukommenden Dateien betreffen, liegt in der Verantwortung des administrativen Nutzers.

                  gruß,
                  wahsaga

                  --
                  /voodoo.css:
                  #GeorgeWBush { position:absolute; bottom:-6ft; }
                  1. Hallo wahsaga,

                    Welches Recht soll überwiegen?

                    vom Grundsatz her neige ich zur Nichtanzeige, d.h.

                    durch kein Muster erfasst: Nichtanzeige
                      Verbot durch ein beliebiges Muster: Nichtanzeige
                      Erlaubnis durch ein beliebiges Muster, wenn kein Verbot vorliegt: Anzeige

                    Wenn, wie Du bereits angesprochen hast, die Nichtanzeige nur auf wenige Muster/Dateien zutreffen soll, würde ich den ersten Grundsatz invertieren:

                    durch kein Muster erfasst: Anzeige
                      Verbot durch ein beliebiges Muster: Nichtanzeige
                      Erlaubnis durch ein beliebiges Muster, wenn kein Verbot vorliegt: Anzeige

                    Es liegen ja Gründe vor, warum bestimmte Dateien nicht angezeigt werden sollen (auch wenn der Zugriff prinzipiell erlaubt ist), diesen Aspekt sehe als Grundsatz des Prinzips "Verbot" geht über "Erlaubnis".

                    Ich würde es nicht komplizierter machen :-)

                    Freundliche Grüße

                    Vinzenz

                    1. hi,

                      Welches Recht soll überwiegen?

                      vom Grundsatz her neige ich zur Nichtanzeige,

                      Ich neige jetzt eher dazu, dies die erste Entscheidung sein zu lassen, die ich adiminstrativ treffen lasse.

                      Davon abhängig dürfen dann die Ausnahmen für gegenteiliges Verhalten definiert werden.

                      Es liegen ja Gründe vor, warum bestimmte Dateien nicht angezeigt werden sollen (auch wenn der Zugriff prinzipiell erlaubt ist), diesen Aspekt sehe als Grundsatz des Prinzips "Verbot" geht über "Erlaubnis".

                      Nein, diese Entscheidung liegt m.E. wirklich in der Hand des Administrierenden.

                      Wenn es nur wenige Dateien sind, die nicht angezeigt werden sollen - dann ist die generelle Erlaubnis mit wenigen zu definierenden Ausnahmen für ihn doch die komfortabler einzurichtende - und auch für das Script die schneller abarbeitbare.
                      Und gleiches natürlich auch andersherum ...

                      Ich würde es nicht komplizierter machen :-)

                      Werde ich jetzt wohl auch nicht mehr tun ;-)

                      gruß,
                      wahsaga

                      --
                      /voodoo.css:
                      #GeorgeWBush { position:absolute; bottom:-6ft; }
    2. hi,

      da solltest Du Dich mal it den NDS (Novell Directory Services)beschäftigen. Es gibt mMn keine bessere Umsetzung für Datei- und Objektrechte.

      Nee, das schießt mir schon über's Ziel hinaus.
      Ich möchte keine zusätzlichen Softwarekomponenten installieren (müssen), sondern möchte selber eine Lösung in PHP erstellen - möglichst schlank.
      Diese Lösung muss keine Rechte auf Dateisystemebene o.ä. implementieren, sondern soll einzig und allein entscheiden, welche im Dateisystem eines (Apache-)Webservers vorhandenen Dateien und Ordner einem Benutzer dieses Scriptes _angezeigt_ werden sollen, und welche nicht. Es soll keinerlei Zugriffsschutz o.ä. bewirken, es geht rein um Anzeigeprivilegien - darf Datei xy in einem Verzeichnislisting gesehen werden, oder nicht. Ob auf Ressource abc über HTTP zugegriffen werden kann oder nicht, wenn die Adresse bekannt ist, ist nicht Bestandteil der Anforderung.

      Man muss schließlich auch berücksichtigen, was in Verzeichnissen uns Unterverzeiochnissen geschieht, ob Rechte vererbt oder die Vererbung unterbrochen werden soll und/oder für einzelne Ressourcen Sonderbestimmungen bestehen.

      Ja, sagte ich doch :-)
      Da liegt ja auch mein Problem, ein Regelwerk dafür gleichzeitig universell und schlank zu halten.

      Und dann wird es spannend, WER denn welche Rechte verwalten, sehen, kontrollieren und ändern darf...

      Nein, soweit soll's nicht gehen.
      Die Regeln soll ein Berechtigter aufstellen/ändern können.
      Gruppen mit verschiedenen Rechten sind nicht vorgesehen.

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      1. Hallo Wahsaga,

        Nee, das schießt mir schon über's Ziel hinaus.

        Du sollst es Dir auch nur angucken, verinnerlichen und dann versuchen, es zu reduzieren. Da es bei den NDS, wie Du schon selber erkannt hast, nicht um Mustererkenneung für Dateinamen gehr, sondern um knallharte Ressourcenverwaltung (mit harten Namen), müsstest Du ohnehin eine Transferleistung erbringen.

        Gehe ich aber Recht in der Annahme, dass das System mehr als glob() http://de2.php.net/manual/de/function.glob.php können soll?

        Definiere doch nochmal, ob es vollkommen unabhängig von der Lage der Ressource arbeiten soll (was eigentlich nicht geht), oder wie der Gültigkeitsbereich eingeschränkt werden soll. -> einzelne Verzeichnisse, ganze Verzeichnisbäume bzw. Teile davon?

        LG
        Chris

        1. hi,

          Gehe ich aber Recht in der Annahme, dass das System mehr als glob() http://de2.php.net/manual/de/function.glob.php können soll?

          Ja, ein wenig mehr schon.

          Definiere doch nochmal, ob es vollkommen unabhängig von der Lage der Ressource arbeiten soll (was eigentlich nicht geht), oder wie der Gültigkeitsbereich eingeschränkt werden soll.

          Also, die Lage der Datei ist natürlich bekannt.
          Jetzt möchte ich für diese Datei ein Entscheidung treffen - und die dafür anzuwendenden Regeln sollen sich

          • voll qualifiziert auf eben diese spezielle Datei beziehen können (bspw. über kompletten Pfad plus Dateiname vom Server Root oder Web Root aus), oder

          • auf bestimmte Teile des Dateinamens wie z.b. die Endung ".txt" oder den Beginn des Dateinamens mit einer Zeichenkette ("Datei_abc*"), oder

          • auf einen teilweise qualifizierten Pfad, z.b. alles was unterhalb von /ordner1/ordnerA/ liegt

          • und Kombinationen dieser Möglichkeiten, z.b. alle "*.php" unterhalb von /ordner_xy/ oder ähnliches.

          -> einzelne Verzeichnisse, ganze Verzeichnisbäume bzw. Teile davon?

          Möglichst flexible Kombinationen.

          Dass mit Suchmustern abzudecken ist ja nicht das eigentliche Problem - sondern eine Entscheidung bzgl. der Priorität zu treffen, bzw. eine sinnvolle Sortierung zu finden, falls mehrere Regeln zutreffen können:

          Auf /ordner1/ordnerA/datei_xyz.php können bspw. die "Regeln"
          "*.php"
          "/ordner1/*"
          "*/ordnerA/*xyz.*"
          zutreffen - und ggf. widersprüchliche Aussagen bzgl. erlaubt/verboten machen.

          Da ich die anzuwendenden Regeln nicht vorgeben, sondern nachher vom einem Scriptnutzer administrieren lassen will, suche ich also nach einer Möglichkeit, bei solchen Konkurrenzsituationen eine sinnvolle Priorisierung zu finden. Ich denke, dass ich dabei vermutlich nicht alles abdecken kann, und noch ein wenig auf den Verstand des Nutzers bei der Regelerstellung setzen muss.

          Klar könnte ich auch _alle_ verfügbaren Dateien auflisten, und den Admin-Nutzer per Checkbox für jede einzelne entscheiden lassen - aber das wäre für ihn unkomfortabel, und auch mir von der Speicherung dieser Flags her zu aufgebläht.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. Hallo wahsaga,

            Du musst also Regeln nach bestimmten Mustern erkennen. So wie Deine Beispiele aussehen, wären dazu einfache, reguläre Ausdrücke geeignet.
            Du könntest also einfach eine Liste von regulären ausdrücken speichern.
            Das alleine ist nun vermutlich nicht sehr effizient, da diese Liste sehr groß werden kann und bei jedem Zugriff alle regulären Ausdrücke ausgewertet werden müssten.

            Wenn man einfache reguläre Ausdrücke wählt, also solche, die im eigentlichen Sinne regulär sind, kann man aber durch einmaliges Durchlaufen eines Pfades feststellen, ob ein regulärer Ausdruck zutrifft.

            Ich würde mich also auf Dinge beschränken, die durch Zeichen | * und Aneinanderreihung darstellbar sind (also auch die üblichen Operatoren +? aber keine Lookahead-Konstrukte oder ähnliche komplizierte Features)

            Man hat nun mehrere Möglichkeiten, das effizient zu implementieren:
            1. Wenn die PHP-Regex-Engine die Ausdrücke optimiert und diese vielleicht sogar vorkompilieren kann: In diesem Fall kann man einfach alle Ausdrücke mit | zu einem zusammenbauen.
            2. Man erzeugt selber einen optimierten regulären Ausdruck, der ohne "vorausschauen" verarbeitbar ist. Also z.B. würde aus abc|abd ab(c|d)
            3. Man implementiert selbst eine Regexp-Engine, die die Ausdrücke vorkompilieren und schnell verarbeiten kann.

            Grüße

            Daniel

  2. Hi Wahsaga,

    ich hoffe, dass Du weißt, was Du hier angestoßen hast.
    Das könnte eine wirklich grundsätzliche Diskussion werden, die viel später noch Vielen etwas bringt.

    Dazu wäre es aber notwendig, dass sich noch ein paar Spezialisten einklinken, die nicht nur auf "Lehrmeinungen" verweisen, sondern auch zur Diskussion bereit sind.

    Dass weder glob(), noch die NDS noch die M$-Methoden bisher befriedingende Antworten auf die Aufgabebstellung geben, können wir am Thread schon absehen...

    Good Luck! Ich bin dabei!

    LG
    Chris

    1. hi,

      ich hoffe, dass Du weißt, was Du hier angestoßen hast.

      "Die Geister, die ich rief ..."?

      Das könnte eine wirklich grundsätzliche Diskussion werden, die viel später noch Vielen etwas bringt.

      Natürlich, solche Regelwerke, ihre Erstellung und Umsetzung, sind komplexe Themen.

      Deshalb frage ich mich auch gerade, ob ich am Anfang nicht die "Erwartungen" an diese Diskussion zu hoch gesteckt habe, in dem ich nicht detailiert erklärt habe, worum es mir geht.

      Ich will den autoindex-Mechanismus eines Webservers für das Verzeichnis-Browsing über HTTP etwas erweitern, um manche Dateien in diesen Listings anzeigen zu lassen, andere nicht.
      Wirkliche _Zugriffsrechte_ stehen nicht zur Diskussion.
      Vielleicht hätte ich das lieber zu Anfang erwähnen sollen, bevor ich mich auf meine komplizierten Vorstellungen zur Realisierung eines "Regelwerks" dafür gestürzt habe. So habe ich langsam den Eindruck, dass du mehr dahinter vermutest, als es eigentlich darstellen soll :-)

      Dass weder glob(), noch die NDS noch die M$-Methoden bisher befriedingende Antworten auf die Aufgabebstellung geben, können wir am Thread schon absehen...

      Aber ich frage mich doch inzwischen, ob ich meine Anforderungen an den Leistungsumfang eines solchen Regelwerkes nicht einfach etwas herunterschrauben sollte - damit ich ein Script für die eigentlich eher kleine Aufgabe, um die es geht - Listing von Verzeichnisinhalten über HTTP - nicht unnötig aufblähe.

      Dafür, dass ich dieses Verzeichnislisting überhaupt von einem PHP-Script übernehmen lassen will, würde ich hier vermutlich schon von einigen was auf die Finger bekommen :-)
      Dass PHP nämlich nicht die performanteste Technik zur Umsetzung solch eines Vorhabens sein dürfte, ist mir bewusst.
      Deshalb ist das Vorhaben auch eher experimenteller Natur.

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
  3. Hi,

    Jetzt stehe ich aber vor der Frage, wie ich bei so einem System konkurrierende Regeln vernünftig priorisiert bekomme.
    Eine "voll qualifizierte" Regel, bspw. für "/ordner1/ordnerA/Datei.xyz", soll natürlich "stärker" sein, als eine dazu konkurrierende "/ordner1/ordner?/*.xyz", die ggf. zum Erlauben/Verbieten eine andere Aussage macht.

    genau dies sollte dann Deine erste Regeldefinition sein - und daraus folgt, daß solche Regeln bevorzugt sortiert bzw. behandelt werden.

    Aber was ist, wenn ich jetzt Testen möchte, ob "ordner1/ordnerA/blah.txt" angezeigt werden darf - und zwei Regeln
    "/ordner1/ordner?/blah.txt" - erlaubt
    "/ordner1/o?dnerA/blah.txt" - verboten
    existieren, die beide zutreffen, aber zu unterschiedlichen Aussagen kommen?

    Hier müßtest Du weitere Regeldefinitionen machen. Z.B.

    • ? ist bedeutender als *
    • je weniger Platzhalter, desto bedeutender
    • Platzhalter in Unterverzeichnissen sind bedeutender als in übergeordneten Verzeichnissen

    Für diesen speziellen Fall wüßte ich allerdings keine einigermaßen sinnvolle Definition als

    • Platzhalter im selben Verzeichnis werden anhand ihrer Position gewichtet (wie auch immer).

    Das Ganze bekommt dann leichte Ähnlichkeit mit CSS.

    freundliche Grüße
    Ingo

    1. hi,

      genau dies sollte dann Deine erste Regeldefinition sein - und daraus folgt, daß solche Regeln bevorzugt sortiert bzw. behandelt werden.

      Das ist von Anfang an klar - deshalb bezeichne ich solche Regeln ja auch als "voll qualifiziert", weil sie eben keinerlei Wildcards enthalten, sondern nur auf jeweils genau eine Datei im Verzeichnisbaum zutreffen können.
      Dass solche Regeln von der Priorität her alle anderen schlagen, war von vornherein so gedacht.

      Hier müßtest Du weitere Regeldefinitionen machen. Z.B.

      • ? ist bedeutender als *
      • je weniger Platzhalter, desto bedeutender
      • Platzhalter in Unterverzeichnissen sind bedeutender als in übergeordneten Verzeichnissen

      Ja, an genau sowas hatte ich gedacht.
      Wobei ich mich inzwischen Frage, ob ich nicht über's Ziel (siehe Erläuterungen hier, https://forum.selfhtml.org/?t=119328&m=765330) hinausschieße, wenn ich mir das Regelwerk so kompliziert mache, dass ich es erst mal aufwendig parsen und sortieren muss.

      Ich denke, ich werde mich doch erst mal auf den Ansatz eines _generellen_ Erlaubens/Verbietens mit jeweils dazu zusätzlich zu definierenden Ausnahmen beschränken - alles andere führt für diesen Einsatzzweck eindeutig zu weit.

      Das Ganze bekommt dann leichte Ähnlichkeit mit CSS.

      :-)

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }