Ответ 1
Вы можете попробовать использовать java.lang.SecurityManager. См. Также этот вопрос об использовании диспетчера безопасности для установки разных параметров безопасности для потока.
Вы можете установить менеджер безопасности и политику безопасности следующим образом:
jython -Djava.security.manager=securitymanager -Djava.security.policy=policyfile
где securitymanager является менеджером безопасности для использования, а файл политики содержит спецификацию политики, как описано, например, здесь. Если вы используете файл политики в качестве источника политики безопасности, вот пример:
grant {
permission java.security.AllPermission;
}
Jython потребуется несколько разрешений для запуска, включая следующее:
grant {
permission java.io.FilePermission "${user.home}${/}-", "read, write";
permission java.lang.RuntimePermission "createClassLoader";
permission java.lang.RuntimePermission "getProtectionDomain";
};
(это предполагает, что ваш cachedir находится в текущем каталоге пользователя HOME). Это сделает что-то близкое к тому, что вам нужно, позволяя читать и записывать доступ к файлам в текущем домашнем пользователе и запрещать доступ ко всем остальным частям файловой системы. Вот результат (первый open() относится к файлу в текущем каталоге HOME пользователя, так как это текущий рабочий каталог):
>>> f1=open('test.txt', 'r')
>>> f2=open('/tmp/test.txt', 'r')
Traceback (innermost last):
File "<console>", line 1, in ?
java.security.AccessControlException: access denied (java.io.FilePermission /tmp/test.txt read)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:342)
at java.security.AccessController.checkPermission(AccessController.java:553)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.SecurityManager.checkRead(SecurityManager.java:888)
at java.io.File.exists(File.java:748)
at org.python.core.PyFile._setup(Unknown Source)
at org.python.core.PyFile.file_init(Unknown Source)
at org.python.core.PyFile$1.new_impl(Unknown Source)
at org.python.core.PyType.invoke_new_(Unknown Source)
at org.python.core.PyType.type___call__(Unknown Source)
at org.python.core.PyType.__call__(Unknown Source)
at org.python.core.PyObject.__call__(Unknown Source)
at org.python.pycode._pyx2.f$0(<console>:1)
at org.python.pycode._pyx2.call_function(<console>)
at org.python.core.PyTableCode.call(Unknown Source)
at org.python.core.PyCode.call(Unknown Source)
at org.python.core.Py.runCode(Unknown Source)
at org.python.core.Py.exec(Unknown Source)
at org.python.util.PythonInterpreter.exec(Unknown Source)
at org.python.util.InteractiveInterpreter.runcode(Unknown Source)
at org.python.util.InteractiveInterpreter.runsource(Unknown Source)
at org.python.util.InteractiveInterpreter.runsource(Unknown Source)
at org.python.util.InteractiveConsole.push(Unknown Source)
at org.python.util.InteractiveConsole.interact(Unknown Source)
at org.python.util.jython.main(Unknown Source)
java.security.AccessControlException: java.security.AccessControlException: access denied (java.io.FilePermission /tmp/test.txt read)
>>>