title: security: access denied exception in Japplet
body: <p>This applet worked fine until yesterday and now it is giving me some exception. Here is the stacktrace:</p>
  
  <pre><code>java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getenv.localappdata")
  Exception in thread "AWT-EventQueue-1" java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup")
      at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366)
      at java.security.AccessController.checkPermission(AccessController.java:560)
      at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
      at sun.applet.AppletSecurity.checkAccess(AppletSecurity.java:252)
      at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)
      at java.lang.Thread.init(Thread.java:376)
      at java.lang.Thread.&lt;init&gt;(Thread.java:485)
      at javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread.&lt;init&gt;(BasicDirectoryModel.java:222)
      at javax.swing.plaf.basic.BasicDirectoryModel.validateFileCache(BasicDirectoryModel.java:140)
      at javax.swing.plaf.basic.BasicDirectoryModel.propertyChange(BasicDirectoryModel.java:69)
      at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335)
      at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:327)
      at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263)
      at java.awt.Component.firePropertyChange(Component.java:8382)
      at javax.swing.JFileChooser.setCurrentDirectory(JFileChooser.java:581)
      at javax.swing.JFileChooser.&lt;init&gt;(JFileChooser.java:344)
      at javax.swing.JFileChooser.&lt;init&gt;(JFileChooser.java:296)
      at gui1.jButton1ActionPerformed(gui1.java:148)
      at gui1.access$000(gui1.java:21)
      at gui1$1.actionPerformed(gui1.java:62)
      at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
      at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
      at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
      at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
      at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
      at java.awt.Component.processMouseEvent(Component.java:6505)
      at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
      at java.awt.Component.processEvent(Component.java:6270)
      at java.awt.Container.processEvent(Container.java:2229)
      at java.awt.Component.dispatchEventImpl(Component.java:4861)
      at java.awt.Container.dispatchEventImpl(Container.java:2287)
      at java.awt.Component.dispatchEvent(Component.java:4687)
      at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
      at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
      at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
      at java.awt.Container.dispatchEventImpl(Container.java:2273)
      at java.awt.Component.dispatchEvent(Component.java:4687)
      at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729)
      at java.awt.EventQueue.access$200(EventQueue.java:103)
      at java.awt.EventQueue$3.run(EventQueue.java:688)
      at java.awt.EventQueue$3.run(EventQueue.java:686)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
      at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
      at java.awt.EventQueue$4.run(EventQueue.java:702)
      at java.awt.EventQueue$4.run(EventQueue.java:700)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
      at java.awt.EventQueue.dispatchEvent(EventQueue.java:699)
      at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
      at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
      at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
      at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
  BUILD SUCCESSFUL (total time: 34 seconds)
  </code></pre>
  
  <p>I also created a policy file and put it in user.home directory with the name .java.policy</p>
  
  <pre><code>grant {
    permission java.io.FilePermission "&lt;&lt;ALL FILES&gt;&gt;", "write";
    permission java.lang.RuntimePermission "getenv.&lt;environment variable name&gt;";
    permission java.io.FilePermission "&lt;&lt;ALL FILES&gt;&gt;", "read";
    permission java.io.FilePermission "&lt;&lt;ALL FILES&gt;&gt;", "delete";
  };
  </code></pre>
  
  <p>Here is the applet code</p>
  
  <pre><code>/*
   * To change this template, choose Tools | Templates
   * and open the template in the editor.
   */
  import javax.swing.JApplet;
  import javax.swing.SwingUtilities;
  import java.io.File;
  import java.io.IOException;
  /*
  &lt;applet code="mainapplet.java" width=500 height=500&gt;
  &lt;/applet&gt;
  */
  /**
   *
   * @author sabertooth
   */
  public class mainapplet extends JApplet {
  
      /**
       * Initialization method that will be called after the applet is loaded
       * into the browser.
       */
      private String localappfolder;
      private String topath;
  
      public void init() {
          // TODO start asynchronous download of heavy resources
          try{
              localappfolder=System.getenv("localappdata");
              topath=localappfolder+"\\ossoc\\";
              new File(topath).mkdir();
  
          }
          catch(Exception e)
          {
              System.out.println(e);
          }
          try {
              SwingUtilities.invokeAndWait(new Runnable() {
  
                  public void run() {
                      createGUI();
                  }
              });
          } catch (Exception e) { 
              System.err.println("createGUI didn't complete successfully");
          }
  
      }
      public void destroy(){
  
  
      }
      // TODO overwrite start(), stop() and destroy() methods
      private void createGUI(){
          gui1 gui1=new gui1();
          gui1.setOpaque(true);
          setContentPane(gui1);
      }
       private static void deleteDir(File dir)
      throws IOException
    {
      if (!dir.isDirectory()) {
        throw new IOException("Not a directory " + dir);
      }
  
  
  
      dir.delete();
    }
  
  }
  </code></pre>