diff --git a/server/src/main/java/com/usatiuk/dhfs/storage/files/objects/DirEntry.java b/server/src/main/java/com/usatiuk/dhfs/storage/files/objects/DirEntry.java index 7a9740da..9e38ffa6 100644 --- a/server/src/main/java/com/usatiuk/dhfs/storage/files/objects/DirEntry.java +++ b/server/src/main/java/com/usatiuk/dhfs/storage/files/objects/DirEntry.java @@ -21,4 +21,6 @@ public abstract class DirEntry extends JObject { public String getName() { return uuid.toString(); } + + long mode; } diff --git a/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileService.java b/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileService.java index a13af68a..88aa9725 100644 --- a/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileService.java +++ b/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileService.java @@ -10,8 +10,9 @@ import java.util.Optional; public interface DhfsFileService { Uni> getDirEntry(String name); Uni> open(String name); - Uni> create(String name); - Uni> mkdir(String name); + Uni> create(String name, long mode); + Uni> mkdir(String name, long mode); + Uni chmod(String name, long mode); Uni rmdir(String name); Uni unlink(String name); Uni rename(String from, String to); diff --git a/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileServiceImpl.java b/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileServiceImpl.java index 270ffd1b..83c0d927 100644 --- a/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileServiceImpl.java +++ b/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileServiceImpl.java @@ -39,7 +39,7 @@ public class DhfsFileServiceImpl implements DhfsFileService { Log.info("Initializing file service"); if (!objectRepository.existsObject(namespace, new UUID(0, 0).toString()).await().indefinitely()) { objectRepository.createNamespace(namespace).await().indefinitely(); - jObjectRepository.writeJObject(namespace, new Directory(new UUID(0, 0))).await().indefinitely(); + jObjectRepository.writeJObject(namespace, new Directory(new UUID(0, 0)).setMode(0755)).await().indefinitely(); } getRoot().await().indefinitely(); } @@ -97,7 +97,7 @@ public class DhfsFileServiceImpl implements DhfsFileService { } @Override - public Uni> create(String name) { + public Uni> create(String name, long mode) { // FIXME: var root = getRoot().await().indefinitely(); var found = traverse(root, Path.of(name).getParent()).await().indefinitely(); @@ -107,6 +107,7 @@ public class DhfsFileServiceImpl implements DhfsFileService { var fuuid = UUID.randomUUID(); File f = new File(fuuid); + f.setMode(mode); jObjectRepository.writeJObject(namespace, f).await().indefinitely(); dir.getChildren().put(Path.of(name).getFileName().toString(), fuuid); @@ -116,7 +117,7 @@ public class DhfsFileServiceImpl implements DhfsFileService { } @Override - public Uni> mkdir(String name) { + public Uni> mkdir(String name, long mode) { // FIXME: var root = getRoot().await().indefinitely(); var found = traverse(root, Path.of(name).getParent()).await().indefinitely(); @@ -126,6 +127,7 @@ public class DhfsFileServiceImpl implements DhfsFileService { var duuid = UUID.randomUUID(); Directory d = new Directory(duuid); + d.setMode(mode); jObjectRepository.writeJObject(namespace, d).await().indefinitely(); dir.getChildren().put(Path.of(name).getFileName().toString(), duuid); @@ -178,6 +180,18 @@ public class DhfsFileServiceImpl implements DhfsFileService { return Uni.createFrom().item(true); } + @Override + public Uni chmod(String name, long mode) { + var dent = getDirEntry(name).await().indefinitely(); + if (dent.isEmpty()) return Uni.createFrom().item(false); + + dent.get().setMode(mode); + + jObjectRepository.writeJObject(namespace, dent.get()).await().indefinitely(); + + return Uni.createFrom().item(true); + } + @Override public Uni> readDir(String name) { var root = getRoot().await().indefinitely(); diff --git a/server/src/main/java/com/usatiuk/dhfs/storage/fuse/DhfsFuse.java b/server/src/main/java/com/usatiuk/dhfs/storage/fuse/DhfsFuse.java index 692cb841..912df352 100644 --- a/server/src/main/java/com/usatiuk/dhfs/storage/fuse/DhfsFuse.java +++ b/server/src/main/java/com/usatiuk/dhfs/storage/fuse/DhfsFuse.java @@ -1,5 +1,6 @@ package com.usatiuk.dhfs.storage.fuse; +import com.sun.security.auth.module.UnixSystem; import com.usatiuk.dhfs.storage.files.objects.DirEntry; import com.usatiuk.dhfs.storage.files.objects.Directory; import com.usatiuk.dhfs.storage.files.objects.File; @@ -38,7 +39,11 @@ public class DhfsFuse extends FuseStubFS { Paths.get(root).toFile().mkdirs(); Log.info("Mounting with root " + root); - mount(Paths.get(root), false, true, new String[]{"-o", "direct_io"}); + var uid = new UnixSystem().getUid(); + var gid = new UnixSystem().getGid(); + + mount(Paths.get(root), false, true, + new String[]{"-o", "direct_io", "-o", "uid=" + String.valueOf(uid), "-o", "gid=" + String.valueOf(gid)}); } @Override @@ -66,11 +71,11 @@ public class DhfsFuse extends FuseStubFS { return -ErrorCodes.ENOENT(); } if (found.get() instanceof File f) { - stat.st_mode.set(S_IFREG | 0777); + stat.st_mode.set(S_IFREG | f.getMode()); stat.st_nlink.set(1); stat.st_size.set(fileService.size(f).await().indefinitely()); - } else if (found.get() instanceof Directory) { - stat.st_mode.set(S_IFDIR | 0777); + } else if (found.get() instanceof Directory d) { + stat.st_mode.set(S_IFDIR | d.getMode()); stat.st_nlink.set(2); } return 0; @@ -106,14 +111,14 @@ public class DhfsFuse extends FuseStubFS { @Override public int create(String path, long mode, FuseFileInfo fi) { - var ret = fileService.create(path).await().indefinitely(); + var ret = fileService.create(path, mode).await().indefinitely(); if (ret.isEmpty()) return -ErrorCodes.ENOSPC(); else return 0; } @Override public int mkdir(String path, long mode) { - var ret = fileService.mkdir(path).await().indefinitely(); + var ret = fileService.mkdir(path, mode).await().indefinitely(); if (ret.isEmpty()) return -ErrorCodes.ENOSPC(); else return 0; } @@ -151,6 +156,13 @@ public class DhfsFuse extends FuseStubFS { return -ErrorCodes.ENOSPC(); } + @Override + public int chmod(String path, long mode) { + var ret = fileService.chmod(path, mode).await().indefinitely(); + if (ret) return 0; + else return -ErrorCodes.EINVAL(); + } + @Override public int readdir(String path, Pointer buf, FuseFillDir filler, long offset, FuseFileInfo fi) { Iterable found;