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.
 

LimDul

Top Contributor
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.
 
K

kneitzel

Gast
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.
 

Schuriko

Bekanntes Mitglied
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.
 

mrBrown

Super-Moderator
Mitarbeiter
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.
 

Schuriko

Bekanntes Mitglied
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.
 

Schuriko

Bekanntes Mitglied
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.
 

LimDul

Top Contributor
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.
 

sascha-sphw

Top Contributor
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.
 

mrBrown

Super-Moderator
Mitarbeiter
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?
 
K

kneitzel

Gast
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Geeignetes Verzeichnis Allgemeine Java-Themen 5
P Wofür ist das Verzeichnis $HOME/.oracle_jre_usage? Allgemeine Java-Themen 3
M Dateien aus einem Verzeichnis auf einem Server auflisten Allgemeine Java-Themen 5
K NetBeans Ordner bei 'Clean&Build' automatisch in dist Verzeichnis kopieren Allgemeine Java-Themen 0
C Verzeichnis ins JMenu einlesen Allgemeine Java-Themen 2
A Class Datei aus Verzeichnis über URLClassLoader laden Allgemeine Java-Themen 2
C Umgebungsvariable Java-Datei in anderem Verzeichnis ausführen Allgemeine Java-Themen 2
K [Refactoring] ClassLoader Verzeichnis durchsuchen lassen Allgemeine Java-Themen 7
R Welches User-Verzeichnis wählen für Configurationsdateien - Windows Allgemeine Java-Themen 2
R Änderungen in einem Verzeichnis beobachten - Windows Allgemeine Java-Themen 3
S Aus executable jar Verzeichnis erstellen Allgemeine Java-Themen 8
reibi Leeres Verzeichnis in ein Zipfile einfügen Allgemeine Java-Themen 12
reibi Schreibrechte auf ein Verzeichnis Allgemeine Java-Themen 3
G Log4J Verzeichnis der Log-Datei konfigurieren Allgemeine Java-Themen 8
A Drucken ändert aktuelles Verzeichnis Allgemeine Java-Themen 2
reibi Aktuelles Verzeichnis in den Klassenpfad nehmen Allgemeine Java-Themen 9
T Eclipse Dateien einzeln aus einem Verzeichnis laden! Allgemeine Java-Themen 6
B ObjectOutputStream verzeichnis wählen Allgemeine Java-Themen 8
Benji0815 Verzeichnis wie im Windows Explorer in einem JTree anzeigen Allgemeine Java-Themen 6
L Applet Verzeichnis lesen Allgemeine Java-Themen 3
B Verzeichnis durchsuchen geschwindigkeit optimieren Allgemeine Java-Themen 6
B in welchem verzeichnis liegen alle installierten klassen? Allgemeine Java-Themen 6
G Klassen aus Verzeichnis laden Allgemeine Java-Themen 13
S Aktuelles Verzeichnis - CMD/Kommandozeilenproblem Allgemeine Java-Themen 9
G Zwischen Datei und Verzeichnis unterscheiden. Allgemeine Java-Themen 11
C Velocity liest template-Dateien nicht aus einem Verzeichnis Allgemeine Java-Themen 3
heart_disease Verzeichnis-Probleme mit ZIP Allgemeine Java-Themen 4
M Verzeichnis durchlaufen und Dateien umbennen Allgemeine Java-Themen 2
P Verzeichnis in JAR-Datei durchgehen Allgemeine Java-Themen 2
G Dateien und Verzeichnisse in einem Verzeichnis zählen Allgemeine Java-Themen 9
W Verzeichnis für Benutzerfiles Allgemeine Java-Themen 7
S Ist File ein root-Verzeichnis? Allgemeine Java-Themen 2
J Herangehensweise: FTP-Transfer von Verzeichnis Allgemeine Java-Themen 8
G Java Klasse in einem anderen Verzeichnis aufrufen Allgemeine Java-Themen 3
H mit javac Verzeichnis kompilieren Allgemeine Java-Themen 2
E Existierendes Verzeichnis nicht gefunden Allgemeine Java-Themen 4
M Verzeichnis auslesen - Fehler in isDirectory()? Allgemeine Java-Themen 4
F Verzeichnis, in dem sich die ausführende jar Datei befindet Allgemeine Java-Themen 9
K Verzeichnis rekursiv aus JAR-Datei extrahieren Allgemeine Java-Themen 6
O Ein Verzeichnis aus der Root ablesen/Dateitypen registrieren Allgemeine Java-Themen 5
P Verzeichnis auwählen Allgemeine Java-Themen 2
S Starten einer Anwendung von einem anderen Verzeichnis Allgemeine Java-Themen 3
P Mit getResource() ein ganzes Verzeichnis laden Allgemeine Java-Themen 5
T Verzeichnis der Klasse Allgemeine Java-Themen 7
J Verzeichnis aus meinem JAR auslesen und abspeichern. Allgemeine Java-Themen 2
G Verzeichnis löschen? Allgemeine Java-Themen 3
W Aktuelles Verzeichnis rausfinden Allgemeine Java-Themen 13
S Probleme mit dem Compilieren von Dateien in Verzeichnis Allgemeine Java-Themen 4
G Dateien zählen im Verzeichnis Allgemeine Java-Themen 11
G aktuelles Verzeichnis Allgemeine Java-Themen 2
A Verzeichnis auflisten - auch innerhalb eines Jars Allgemeine Java-Themen 6
G Verzeichnis überwachen Allgemeine Java-Themen 13
S Temporäres Verzeichnis anlegen? Allgemeine Java-Themen 4
G Java Runtime Verzeichnis ermitteln Allgemeine Java-Themen 3
S dringend-verzeichnis von festplatte einlesen Allgemeine Java-Themen 9
P Dateinamen testen? Schreibrechte auf Verzeichnis testen? Allgemeine Java-Themen 8
M Verzeichnis verschieben? Allgemeine Java-Themen 2
G Bestimmte Dateien aus Verzeichnis löschen Allgemeine Java-Themen 5
S Programm starten mit Runtime aktuelles Verzeichnis wechseln Allgemeine Java-Themen 7
S Map die die auch ein getKey(value) erlaubt? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben