Можно ли в песочнице просто запустить - PullRequest
0 голосов
/ 06 декабря 2018

Можно ли поместить в песочницу мой Runnable в Java?Учитывая Runnable, я хочу, чтобы код внутри него (вместе с какими-либо потоками, которые он порождает) запускался в песочнице, которая позволяет коду обращаться только к определенному пути в файловой системе.Как только этот Runnable завершится, поток должен вернуться к тем нормальным разрешениям, которые у него были, в то время как для всех оставшихся порожденных потоков все равно будет применено ограничение файловой системы.

Я хочу сделать это во время выполнения.Это означает, что я хочу избежать создания файлов политики и передачи пользовательских аргументов в JVM.До сих пор я был в состоянии применить изолированную программную среду ко всему моему приложению, но я не нашел способа применить его только к Runnable, работающему в текущем потоке ...

if (System.getSecurityManager() == null) {
    System.setSecurityManager(new SecurityManager());
}

CodeSource nullSource = new CodeSource(null, (CodeSigner[]) null);

PermissionCollection perms = new Permissions();
perms.add(new FilePermission(path.toAbsolutePath().toString() + "/*", "read"));

ProtectionDomain domain = new ProtectionDomain(nullSource, perms);
AccessControlContext safeContext = new AccessControlContext(
        new ProtectionDomain[]{domain});

AccessController.doPrivileged((PrivilegedAction) () -> {
    try {
        r.run();
    } catch (Exception e) {
        throw new IllegalStateException(e);
    }
    return null;
}, safeContext);
...