Я обнаружил, что права доступа к файлам изменились между Tomcat 8 и Tomcat 9, и я не могу понять, как это обойти.
У меня был такой код, где inputStream — это то, что я передаю этой процедуре, а redirectStream — это функция, которая просто использует потоки BufferedInput и BufferedOutput для чтения из одного потока в другой.
Path path = "/some/example/path/to/a/file";
Files.createDirectories(path.getParent());
redirectStream(inputStream, new FileOutputStream(path.toFile());
После выполнения этого фрагмента кода в Tomcat8 права доступа к каталогам и файлам будут соответствовать маске пользователя (0022). То есть каталоги будут иметь drwxr-xr-x
, а файлы будут иметь -rw-r--r--
. Поскольку эти файлы, которые он записывает, затем доступны в Интернете, необходим глобальный флаг чтения.
Но под Tomcat9 выдает тот же код, drwxr-x---
и -rw-r-----
соответственно, и поэтому не виден в интернете. Я пробовал две вещи. Один я явно установил umask на 0022 в своем сценарии запуска tomcat, просто чтобы убедиться, что это не имеет никакого эффекта. Второй — явно установить разрешения в коде, чтобы попытаться вызвать проблему. Это исправило права доступа к файлу, но НЕ не права доступа к каталогу, и ниже приведен обновленный код.
Set<PosixFilePermission> perms = new HashSet<PosixFilePermission>();
perms.add(PosixFilePermission.OWNER_READ);
perms.add(PosixFilePermission.OWNER_WRITE);
perms.add(PosixFilePermission.OWNER_EXECUTE);
perms.add(PosixFilePermission.GROUP_READ);
perms.add(PosixFilePermission.GROUP_WRITE);
perms.add(PosixFilePermission.GROUP_EXECUTE);
perms.add(PosixFilePermission.OTHERS_READ);
perms.add(PosixFilePermission.OTHERS_EXECUTE);
Files.createDirectories(path.getParent(), PosixFilePermissions.asFileAttribute(perms));
redirectStream(inputStream, new FileOutputStream(path.toFile());
perms = new HashSet<PosixFilePermission>();
perms.add(PosixFilePermission.OWNER_READ);
perms.add(PosixFilePermission.OWNER_WRITE);
perms.add(PosixFilePermission.GROUP_READ);
perms.add(PosixFilePermission.GROUP_WRITE);
perms.add(PosixFilePermission.OTHERS_READ);
Files.setPosixFilePermissions(fullPath, perms);
Что на самом деле исправляет права доступа к файлу, но НЕ права доступа к файлам каталогов. Я тестировал код вне Tomcat и поэтому знаю, что он работает. Но по какой-то причине среда Tomcat9 каким-то образом делает так, что каталоги по-прежнему получают ограниченные разрешения.
Любые идеи здесь?