minecraft-src/net/minecraft/world/level/validation/DirectoryValidator.java
2025-07-04 01:41:11 +03:00

81 lines
2.7 KiB
Java

package net.minecraft.world.level.validation;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.List;
public class DirectoryValidator {
private final PathMatcher symlinkTargetAllowList;
public DirectoryValidator(PathMatcher symlinkTargetAllowList) {
this.symlinkTargetAllowList = symlinkTargetAllowList;
}
public void validateSymlink(Path directory, List<ForbiddenSymlinkInfo> entries) throws IOException {
Path path = Files.readSymbolicLink(directory);
if (!this.symlinkTargetAllowList.matches(path)) {
entries.add(new ForbiddenSymlinkInfo(directory, path));
}
}
public List<ForbiddenSymlinkInfo> validateSymlink(Path directory) throws IOException {
List<ForbiddenSymlinkInfo> list = new ArrayList();
this.validateSymlink(directory, list);
return list;
}
public List<ForbiddenSymlinkInfo> validateDirectory(Path directory, boolean validateSymlinks) throws IOException {
List<ForbiddenSymlinkInfo> list = new ArrayList();
BasicFileAttributes basicFileAttributes;
try {
basicFileAttributes = Files.readAttributes(directory, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS);
} catch (NoSuchFileException var6) {
return list;
}
if (basicFileAttributes.isRegularFile()) {
throw new IOException("Path " + directory + " is not a directory");
} else {
if (basicFileAttributes.isSymbolicLink()) {
if (!validateSymlinks) {
this.validateSymlink(directory, list);
return list;
}
directory = Files.readSymbolicLink(directory);
}
this.validateKnownDirectory(directory, list);
return list;
}
}
public void validateKnownDirectory(Path directory, List<ForbiddenSymlinkInfo> forbiddenSymlinkInfos) throws IOException {
Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
private void validateSymlink(Path path, BasicFileAttributes attributes) throws IOException {
if (attributes.isSymbolicLink()) {
DirectoryValidator.this.validateSymlink(path, forbiddenSymlinkInfos);
}
}
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attributes) throws IOException {
this.validateSymlink(dir, attributes);
return super.preVisitDirectory(dir, attributes);
}
public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) throws IOException {
this.validateSymlink(file, attributes);
return super.visitFile(file, attributes);
}
});
}
}