Verzeichnis schreibzugriffe erlaubt unabhängig von ACL und Posix

Schuriko

Bekanntes Mitglied
Ich habe mir mal eine Funktion zum erstellen eines Verzeichnisses, unabhängig von ACL und Posix erstellt. Bis jetzt sieht meine Funktion wie folgt aus:
Java:
    public boolean createXMLUploadDirectory() throws IOException {
        boolean ret = false;
        Path xmlDirectoryPath = this.getXMLUploadDirectory();
        
        if (!Files.exists(xmlDirectoryPath)) {
            LOGGER.info("create directory: " + xmlDirectoryPath);
            
            FileAttribute<?> fileAttributes;       
            FileStore fileStore = Files.getFileStore(xmlDirectoryPath);
            
            if(fileStore.supportsFileAttributeView("posix")) {                   
                LOGGER.info("Posix File System");
                
                // Linux(POSIX) - System
                Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr-xr-x");
                fileAttributes = PosixFilePermissions.asFileAttribute(perms);
            } else if(fileStore.supportsFileAttributeView("acl")) {               
                LOGGER.info("ACL File System");
                
                // Windows(ACL) - System
                fileAttributes = new FileAttribute<List<AclEntry>>() {
                    
                    @Override
                    public List<AclEntry> value() {
                        // lookup user principal
                        FileSystem fileSystem = FileSystems.getDefault();
                        UserPrincipalLookupService userPrincipalLookupService = fileSystem.getUserPrincipalLookupService();
                        UserPrincipal userPrincipal = null;
                        
                        try {
                            userPrincipal = userPrincipalLookupService.lookupPrincipalByName("JStas");
                        } catch (IOException e) {
                            throw new RuntimeException(e);
                        }
                        
                        // select ACL flags
                        Set<AclEntryFlag> flags = EnumSet.of(AclEntryFlag.FILE_INHERIT, AclEntryFlag.DIRECTORY_INHERIT);
            
                        // select ACL permission
                        Set<AclEntryPermission> permissions = EnumSet.of(AclEntryPermission.READ_DATA, AclEntryPermission.WRITE_DATA, AclEntryPermission.EXECUTE);
                        
                        // build ACL entry
                        Builder builder = AclEntry.newBuilder();
                        builder.setFlags(flags);
                        builder.setPermissions(permissions);
                        builder.setPrincipal(userPrincipal);
                        builder.setType(AclEntryType.DENY);
            
                        AclEntry entry = builder.build();
                        List<AclEntry> aclEntryList = new ArrayList<>();
                        aclEntryList.add(entry);
            
                        return aclEntryList;                       
                    }                     
                    
                    @Override
                    public String name() {
                        return "acl:acl";
                    }                   
                 };               
            } else {
                String msg = "no recognized attribute view";
                LOGGER.error(msg);
                throw new UnsupportedOperationException(msg);               
            }
            
            Files.createDirectory(xmlDirectoryPath, fileAttributes);
            ret = true;
        } else {
            // sicherstellen dass Verzeichnis existiert und schreibzugriffe erlaubt.
        }

Ich kenne zwar die Funktionen isWritable() und Co, allerdings weis ich nicht ob z.B. isWritable() bei ACL und Posix - Systemen funktioniert. Vielleicht denke ich auch zu kompliziert und es gibt einen einfacheren Weg garantiert beschreibbare Verzeichnisse zu erstellen und sie beschreibbar zu machen.
Weil ich mir beim besten Willen nicht vorstellen kann, dass ich der erste bin der auf dieses Problem stößt und somit nicht bereits eine Funktion existiert.
 
Erste Frage: Was ist das Problem? Welches Problem willst du lösen und ist das überhaupt ein Problem?

Normalerweise sollte ein durch File API angelegtes Verzeichnis beschreibbar sein.
 
Was mir im Augenblick nicht einleuchtet ist die Notwendigkeit. Dein Pattern war ja ein temporäres File in einem neuen Verzeichnis. Wo hast Du das Verzeichnis angelegt?

Unter Windows sollte doch eigentlich an fast allen Stellen die Vererbung von Rechten eingeschaltet sein. Somit sollte das Verzeichnis mit entsprechenden ACLs versehen sein. Oder macht Java hier irgend etwas anderes, das eben genau dies bricht?

Generell ist es nun einmal so, dass ein Admin oder der User Rechtestrukturen vorgibt. Und wenn ich eine umask setze (auf Posix Systemen), dann soll die doch bitte beachtet werden. Ich will doch nicht ständig und überall prüfen, ob eine Applikation mir andere Rechte setzt oder nicht.
Klar - es gibt da durchaus genug Szenarien, wo das wichtig ist. Beispiele könnten Sicherheitsrelevante Daten sein, wo wirklich nur der User Zugriff haben sollte oder eben Dinge, wo sicher gestellt sein sollte, dass die Gruppe Rechte bekommt ... Aber das sind doch eher Ausnahmen. Die Regel sollte sein, dass System-Vorgaben umgesetzt werden.

Ich hatte aber leider bisher keine Zeit, mir das auf meinem System im Detail anzusehen. Daher frage ich einfach nur einmal ganz dumm und dreist hier im Thread - in der Hoffnung, dass einer von euch da schon bessere Erkenntnisse hat....

Was mir im Code auffällt:
Java:
userPrincipal = userPrincipalLookupService.lookupPrincipalByName("JStas");

Da würde ich nichts hartkodiertes nehmen. Owner des Verzeichnisses, aktueller User oder etwas in der Art wäre da deutlich besser denke ich mal.
 
Erste Frage: Was ist das Problem? Welches Problem willst du lösen und ist das überhaupt ein Problem?

Normalerweise sollte ein durch File API angelegtes Verzeichnis beschreibbar sein.
also ich möchte ein Verzeichnis erstellen, welches garantiert beschreibbar ist (sowohl unter Linux als auch unter Windows). Wenn ich mir z.B. unter Windows 10 über die normale createDirectory -Funktion ein Verzeichnis mir erstellen, so ist unter Windows 10 dieses, durch die Sicherheitsbeschränkung schreibgeschützt. Es können in diesem neuen Verzeichnis dann keine Dateien abgelegt werden.
 
also ich möchte ein Verzeichnis erstellen, welches garantiert beschreibbar ist (sowohl unter Linux als auch unter Windows). Wenn ich mir z.B. unter Windows 10 über die normale createDirectory -Funktion ein Verzeichnis mir erstellen, so ist unter Windows 10 dieses, durch die Sicherheitsbeschränkung schreibgeschützt. Es können in diesem neuen Verzeichnis dann keine Dateien abgelegt werden.
Ich kann nur die Frage aus dem anderem Thread wiederholen: was genau passiert denn, wenn du den Initialen Code dort ausführst. Du hast bisher an keiner Stelle gesagt, wie sich der Fehler eigentlich zeigst, und insbesondere keine Exception erwähnt.

Der initiale Fehler, ohne irgendwelches weiteres rumprobieren mit Permissions und sonstigem ist das relevante, ohne den kann man nicht helfen.
 
Was mir im Augenblick nicht einleuchtet ist die Notwendigkeit. Dein Pattern war ja ein temporäres File in einem neuen Verzeichnis. Wo hast Du das Verzeichnis angelegt?
Unter Windows 10 in dem momentanen Ordner (Ordner wird später noch geändert) C:\Users\PC\git\repository\Immonika
Unter Windows sollte doch eigentlich an fast allen Stellen die Vererbung von Rechten eingeschaltet sein. Somit sollte das Verzeichnis mit entsprechenden ACLs versehen sein. Oder macht Java hier irgend etwas anderes, das eben genau dies bricht?
s. voherigen Beitrag zu @LimDul
Generell ist es nun einmal so, dass ein Admin oder der User Rechtestrukturen vorgibt. Und wenn ich eine umask setze (auf Posix Systemen), dann soll die doch bitte beachtet werden. Ich will doch nicht ständig und überall prüfen, ob eine Applikation mir andere Rechte setzt oder nicht.
Klar - es gibt da durchaus genug Szenarien, wo das wichtig ist. Beispiele könnten Sicherheitsrelevante Daten sein, wo wirklich nur der User Zugriff haben sollte oder eben Dinge, wo sicher gestellt sein sollte, dass die Gruppe Rechte bekommt ... Aber das sind doch eher Ausnahmen. Die Regel sollte sein, dass System-Vorgaben umgesetzt werden.
Gebe dir schon Recht, aber es muss doch möglich sein sich ein beschreibbares Verzeichnis zu erstellen, in dem man seine Uploads (dafür ist es später gedacht) erstellen kann.

Als es ist wie folgt angedacht (Spring Projekt): Aus einer application.properties hole ich mir den Namen des Upload - Verzeichnisses. Dann wird geprüft, ob dieses Verzeichnis existiert oder nicht. Wenn es existiert so muss sichergestellt werden, dass das Verzeichnis beschreibbar ist. Wenn es nicht existiert, so wird das in application.properties angegebene garantiert beschreibbare Verzeichnis erstellt.
 
Ich kann nur die Frage aus dem anderem Thread wiederholen: was genau passiert denn, wenn du den Initialen Code dort ausführst. Du hast bisher an keiner Stelle gesagt, wie sich der Fehler eigentlich zeigst, und insbesondere keine Exception erwähnt.

Der initiale Fehler, ohne irgendwelches weiteres rumprobieren mit Permissions und sonstigem ist das relevante, ohne den kann man nicht helfen.
Es wird ja ein Verzeichnis erstellt, somit keine Exception. Das Problem ist, dass es schreibgeschützt erstellt wird unter Windows 10.
 
Dann sollte die Lösung sein, wenn das erstellte Verzeichnis nicht beschreibbar ist (da sollte isWriteable oder der Versuch eine Datei zu erstellen ausreichen zum testen), dann muss ein Fallback auf ein beschreibare Verzeichnis gehen. Im Letzten Fallback einfach eine Datei im Standard-Temp Verzeichnis.

Ich würde keinen Stress mit ACL & Posix Rechten treiben. Wenn das konfigurierte Verzeichnis so ist, dass es nicht beschreibbar ist, dann ist das ein Problem was nicht die Anwendung lösen muss. Sondern das muss mehr der Admin/User lösen der die Anwendung konfiguriert. Wenn ich ein falsches Passwort hinterlegt prüft die Anwendung ja auch nicht, ob vielleicht eine minimale Abwandlung davon das richtige ist. Genauso wenn ich ein nicht beschreibares Verzeichnis hinterlege.
 
Als es ist wie folgt angedacht (Spring Projekt): Aus einer application.properties hole ich mir den Namen des Upload - Verzeichnisses. Dann wird geprüft, ob dieses Verzeichnis existiert oder nicht. Wenn es existiert so muss sichergestellt werden, dass das Verzeichnis beschreibbar ist. Wenn es nicht existiert, so wird das in application.properties angegebene garantiert beschreibbare Verzeichnis erstellt.
Im Normalfall ist doch das Vorgehen wie folgt:
  1. System Admin erstellt einen Upload Ordner und setzt schreibrechte für die Applikation.
  2. System Admin passt den Ordner Pfad in den Properties an.
  3. System Admin startet die Applikation.
Somit muss die Applikation prüfen ob der Ordner den der Admin angelegt hat beschreibbar ist, wenn nicht beendet sich die Applikation mit einer aussagekräftigen Fehlermeldung.
 
Es wird ja ein Verzeichnis erstellt, somit keine Exception. Das Problem ist, dass es schreibgeschützt erstellt wird unter Windows 10.
In dem Orginal-Code legst du nicht nur ein Verzeichnis an, sondern erstellst darin mit File.createTempFile auch eine neue Datei.

Da du weiterhin keine Exception erwähnst, gehe ich davon aus, das keine geworfen wurde – dann wäre es interessant, was createTempFile zurück gibt, null ist es laut dir ja auch nicht, also wird ein File-Objekt (=ein Pfad) zurückgegeben?
 
Unter Windows 10 in dem momentanen Ordner (Ordner wird später noch geändert) C:\Users\PC\git\repository\Immonika
Dann schau Dir doch erst einmal auf der Windows Kiste die Rechte an. Was ist denn da an Rechten gesetzt?

Ich habe jetzt einmal bei mir auf meinem System etwas getestet und die Windows Rechte werden bei einem einfachen Erzeugen eines Verzeichnisses nicht beeinflusst, d.h. die Vererbung wird normal beibehalten.

Du scheinst da ein User-Verzeichnis zu haben, oder was ist PC für ein Verzeichnis? Ich unterstelle einmal, dass da "PC" einfach der Name des Users ist und c:\Users\PC dann das Homeverzeichnis des Users.

Bei einem Homeverzeichnis sollte die Vererbung unterbrochen sein. Ich zeige das einfach einmal anhand eines Bildschirmfotos meines User-Ordners:
RechteUserordner.png

Man erkennt: Vererbung ist aus. Aber auf dem Ordner ist Vollzugriff für System, Administratoren und meinen User gesetzt - und das so, dass diese Regeln den aktuellen Ordner, Unterordner und Dateien umfasst. Erstelle ich nun einen Ordner in meinem User-Ordner, dann erbt er diese Rechte:

RechteUserordnerNeuerOrdner.png
==> Vererbung ist aktiv und die Rechte sind vom übergeordneten Ordner übernommen worden.

Das ist auch so, wenn ich Ordner per Java anlege also mit etwas wie:
Files.createDirectory(Paths.get("./TestDir"));

Somit ist es so, wie ich es mir schon gedacht habe: Java macht da keine "unanständigen Dinge", die man nicht erwarten würde.

Daher ist wirklich die Frage, was Du da wie an Rechten gesetzt hast. Denn ich vermute erst einmal, dass Du da irgendwas dubioses gesetzt hast, weshalb Du diese Probleme hast. Und da ist die Lösung dann eher eine saubere Konfiguration und nicht irgendwelcher Code.
 

Neue Themen


Zurück
Oben