# Security Policy

ES4X allows you to run your applications in a total secure sandbox. Just like deno (opens new window), ES4X can isolate the application. The technology behind this is the JVM security manager (opens new window). Security managers were what isolated the old Applet code from accessing the host machine. They are more fine grained than what you get today in deno.

# Create a security.policy

To create a security policy, run the es4x tool:

$ es4x security-policy

Creating a new 'security.policy' with full network access and
read-only IO access to the working directory.

The generated file is a plain template, if you open it you can read:

// Grant the following permissions to code that shall be executed from
// the node_modules/.lib/* directory
grant codeBase "file:\${user.dir}\${/}node_modules\${/}.lib\${/}*" {
  // vert.x will need full access to the temp dir.
  permission java.io.FilePermission "\${java.io.tmpdir}\${/}-", "read,write,delete";

  // the code should be able to read the JVM/GraalVM runtime libs
  permission java.io.FilePermission "\${java.home}", "read";
  permission java.io.FilePermission "\${java.home}\${/}..\${/}release", "read";
  permission java.io.FilePermission "\${java.home}\${/}-", "read";

  // applications are allowed to read all files from the CWD
  permission java.io.FilePermission "\${user.dir}\${/}-", "read";
  // uncomment the following to allow full read access
  //permission java.io.FilePermission "<<ALL FILES>>", "read";

  // Netty performs some reflection we need to allow it
  permission java.lang.reflect.ReflectPermission "suppressAccessChecks";

  // By default we allow all runtime permissions
  // users may want to restrict this further say for example to
  // deny access to environment variables, etc...
  permission java.lang.RuntimePermission "*";

  // ES4X setup a nice looking logger
  permission java.util.logging.LoggingPermission "control";

  // Allow full access to JVM system properties
  permission java.util.PropertyPermission "*", "read,write";

  // currently we allow all access to the network
  permission java.net.SocketPermission "*", "accept,connect,listen,resolve";
};

So this template gives full network access and read only access to the all files from the CWD where the application started.

TIP

Once you know all the required permissions for your application you can start restricting even more!

WARNING

Even though this template looks like a good start, remember that the CWD is read only, so for example if you're running and http server that does file uploads, unless the uploads land on the $TEMP directory, they will fail as there is no way to write from the application.