home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 June / CHIPHEFT062001.ISO / browser / nc32lyc / comm.z / java40.jar / netscape / security / PrivilegeManager.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-08-15  |  26.4 KB  |  1,593 lines

  1. package netscape.security;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.OutputStream;
  9. import netscape.util.Archive;
  10. import netscape.util.Archiver;
  11. import netscape.util.CodingException;
  12. import netscape.util.Enumeration;
  13. import netscape.util.Hashtable;
  14. import netscape.util.Unarchiver;
  15.  
  16. public final class PrivilegeManager {
  17.    public static final int PROPER_SUBSET = -1;
  18.    public static final int EQUAL = 0;
  19.    public static final int NO_SUBSET = 1;
  20.    public static final int SIGNED_APPLET_DBNAME = 1;
  21.    public static final int TEMP_FILENAME = 2;
  22.    public static int theDebugLevel;
  23.    private static final int DEBUG = 0;
  24.    private Hashtable itsPrinToPrivTable = new Hashtable();
  25.    private Hashtable itsPrinToMacroTargetPrivTable = new Hashtable();
  26.    private static Principal theSystemPrincipal;
  27.    private static Principal[] theSystemPrincipalAry;
  28.    private static Target theSystemTarget;
  29.    private static boolean theSecurityInited;
  30.    private static Principal theUnsignedPrincipal;
  31.    private static Principal[] theUnsignedPrincipalAry;
  32.    private static Principal theUnknownPrincipal;
  33.    private static Principal[] theUnknownPrincipalAry;
  34.    static Object UpdateLock = new Object();
  35.    private static String SignedAppletDBName = null;
  36.  
  37.    private static native void initClass();
  38.  
  39.    private static void init() {
  40.       try {
  41.          theSystemPrincipal = Principal.createSystemPrincipal();
  42.       } catch (IllegalArgumentException var0) {
  43.          theSystemPrincipal = new Principal(12, "52:54:45:4e:4e:45:54:49");
  44.       }
  45.  
  46.       theSystemPrincipalAry = new Principal[1];
  47.       theSystemPrincipalAry[0] = theSystemPrincipal;
  48.       theSystemTarget = Target.findTarget("SuperUser", theSystemPrincipal);
  49.       theUnsignedPrincipal = new Principal(12, "4a:52:4f:53:4b:49:4e:44");
  50.       theUnsignedPrincipalAry = new Principal[1];
  51.       theUnsignedPrincipalAry[0] = theUnsignedPrincipal;
  52.       theUnknownPrincipal = new Principal(12, "52:4f:53:4b:49:4e:44:4a");
  53.       theUnknownPrincipalAry = new Principal[1];
  54.       theUnknownPrincipalAry[0] = theUnknownPrincipal;
  55.    }
  56.  
  57.    public PrivilegeManager() {
  58.       this.itsPrinToPrivTable.put(getSystemPrincipal(), new SystemPrivilegeTable());
  59.       this.itsPrinToMacroTargetPrivTable.put(getSystemPrincipal(), new SystemPrivilegeTable());
  60.       initClass();
  61.       this.load();
  62.       if (this.isJavaSecurityDefaultTo30Enabled()) {
  63.          Target var1 = Target.findTarget("30Capabilities", getSystemPrincipal());
  64.          Privilege var2 = Privilege.findPrivilege(1, 1);
  65.          this.registerPrincipalAndSetPrivileges(theUnsignedPrincipal, var1, var2);
  66.       }
  67.  
  68.    }
  69.  
  70.    private void registerPrincipal(Principal var1) {
  71.       Hashtable var2 = this.itsPrinToPrivTable;
  72.       synchronized(var2){}
  73.  
  74.       try {
  75.          if (this.itsPrinToPrivTable.get(var1) == null) {
  76.             this.itsPrinToPrivTable.put(var1, new PrivilegeTable());
  77.          }
  78.       } catch (Throwable var8) {
  79.          throw var8;
  80.       }
  81.  
  82.       var2 = this.itsPrinToMacroTargetPrivTable;
  83.       synchronized(var2){}
  84.  
  85.       try {
  86.          if (this.itsPrinToMacroTargetPrivTable.get(var1) == null) {
  87.             this.itsPrinToMacroTargetPrivTable.put(var1, new PrivilegeTable());
  88.          }
  89.       } catch (Throwable var7) {
  90.          throw var7;
  91.       }
  92.  
  93.    }
  94.  
  95.    private void unregisterPrincipal(Principal var1) {
  96.       if (getSystemPrincipal().equals(var1)) {
  97.          throw new ForbiddenTargetException("Can not delete system principal");
  98.       } else {
  99.          Hashtable var3 = this.itsPrinToPrivTable;
  100.          synchronized(var3){}
  101.  
  102.          try {
  103.             Object var2 = this.itsPrinToPrivTable.remove(var1);
  104.             if (var2 == null) {
  105.                throw new ForbiddenTargetException("Couldn't delete principal");
  106.             }
  107.          } catch (Throwable var9) {
  108.             throw var9;
  109.          }
  110.  
  111.          var3 = this.itsPrinToMacroTargetPrivTable;
  112.          synchronized(var3){}
  113.  
  114.          try {
  115.             Object var10 = this.itsPrinToMacroTargetPrivTable.remove(var1);
  116.             if (var10 == null) {
  117.                throw new ForbiddenTargetException("Couldn't delete principal");
  118.             }
  119.          } catch (Throwable var8) {
  120.             throw var8;
  121.          }
  122.  
  123.       }
  124.    }
  125.  
  126.    private native boolean checkPrivilegeEnabled(Target[] var1, int var2, Object var3, boolean var4);
  127.  
  128.    public void checkPrivilegeEnabled(Target var1) {
  129.       Target[] var2 = new Target[1];
  130.       Target var3 = Target.findTarget(var1);
  131.       if (var3 != var1) {
  132.          throw new ForbiddenTargetException(var1 + " is not a registered target");
  133.       } else {
  134.          var2[0] = var3;
  135.          this.checkPrivilegeEnabled(var2, 1, (Object)null, true);
  136.       }
  137.    }
  138.  
  139.    public void checkPrivilegeEnabled(Target var1, Object var2) {
  140.       Target[] var3 = new Target[1];
  141.       Target var4 = Target.findTarget(var1);
  142.       if (var4 != var1) {
  143.          throw new ForbiddenTargetException(var1 + " is not a registered target");
  144.       } else {
  145.          var3[0] = var4;
  146.          this.checkPrivilegeEnabled(var3, 1, var2, true);
  147.       }
  148.    }
  149.  
  150.    public static void checkPrivilegeEnabled(String var0) {
  151.       PrivilegeManager var1 = getPrivilegeManager();
  152.       if (var1 == null) {
  153.          throw new ForbiddenTargetException("access to target denied");
  154.       } else {
  155.          Target[] var2 = new Target[]{Target.findTarget(var0)};
  156.          if (var2[0] == null) {
  157.             throw new ForbiddenTargetException(var0 + " target not found");
  158.          } else {
  159.             var1.checkPrivilegeEnabled(var2, 1, (Object)null, true);
  160.          }
  161.       }
  162.    }
  163.  
  164.    boolean isPrivilegeEnabled(Target var1, int var2) {
  165.       Target[] var3 = new Target[]{var1};
  166.       return this.isPrivilegeEnabled(var3, var2 + 1, (Object)null);
  167.    }
  168.  
  169.    boolean isPrivilegeEnabled(Target[] var1, int var2, Object var3) {
  170.       int var4 = var1.length;
  171.  
  172.       while(var4-- > 0) {
  173.          if (var1[var4] == null) {
  174.             throw new ForbiddenTargetException("Null target is passed.");
  175.          }
  176.       }
  177.  
  178.       return this.checkPrivilegeEnabled(var1, var2 + 1, var3, false);
  179.    }
  180.  
  181.    private static void enablePrivilegePrivate(String var0, int var1) {
  182.       PrivilegeManager var2 = getPrivilegeManager();
  183.       if (var2 == null) {
  184.          throw new ForbiddenTargetException("access to target denied");
  185.       } else {
  186.          Target var3 = Target.findTarget(var0);
  187.          if (var3 == null) {
  188.             throw new ForbiddenTargetException(var0 + " target not found");
  189.          } else {
  190.             var2.enablePrincipalPrivilegeHelper(var3, var1 + 1, (Principal)null, (Object)null);
  191.             var2.enableScopePrivilegeHelper(var3, var1 + 1, (Object)null, false, (Principal)null);
  192.          }
  193.       }
  194.    }
  195.  
  196.    public static void enablePrivilege(String var0) {
  197.       enablePrivilegePrivate((String)var0, 1);
  198.    }
  199.  
  200.    public static Object enableTarget(String var0) {
  201.       enablePrivilegePrivate((String)var0, 1);
  202.       return null;
  203.    }
  204.  
  205.    private void enablePrivilegePrivate(Target var1, int var2) {
  206.       this.enablePrincipalPrivilegeHelper(var1, var2 + 1, (Principal)null, (Object)null);
  207.       this.enableScopePrivilegeHelper(var1, var2 + 1, (Object)null, false, (Principal)null);
  208.    }
  209.  
  210.    public void enablePrivilege(Target var1) {
  211.       this.enablePrivilegePrivate((Target)var1, 1);
  212.    }
  213.  
  214.    public Object enableTarget(Target var1) {
  215.       this.enablePrivilegePrivate((Target)var1, 1);
  216.       return null;
  217.    }
  218.  
  219.    private void enablePrivilegePrivate(Target var1, Principal var2, int var3) {
  220.       this.enablePrincipalPrivilegeHelper(var1, var3 + 1, var2, (Object)null);
  221.       this.enableScopePrivilegeHelper(var1, var3 + 1, (Object)null, false, var2);
  222.    }
  223.  
  224.    public void enablePrivilege(Target var1, Principal var2) {
  225.       this.enablePrivilegePrivate(var1, var2, 1);
  226.    }
  227.  
  228.    public Object enableTarget(Target var1, Principal var2) {
  229.       this.enablePrivilegePrivate(var1, var2, 1);
  230.       return null;
  231.    }
  232.  
  233.    private void enablePrivilegePrivate(Target var1, Principal var2, Object var3, int var4) {
  234.       this.enablePrincipalPrivilegeHelper(var1, var4 + 1, var2, var3);
  235.       this.enableScopePrivilegeHelper(var1, var4 + 1, var3, false, var2);
  236.    }
  237.  
  238.    public void enablePrivilege(Target var1, Principal var2, Object var3) {
  239.       this.enablePrivilegePrivate(var1, var2, var3, 1);
  240.    }
  241.  
  242.    public Object enableTarget(Target var1, Principal var2, Object var3) {
  243.       this.enablePrivilegePrivate(var1, var2, var3, 1);
  244.       return null;
  245.    }
  246.  
  247.    void enablePrivilege(String var1, int var2) {
  248.       Target var3 = Target.findTarget(var1);
  249.       if (var3 == null) {
  250.          throw new ForbiddenTargetException(var1 + " target not found");
  251.       } else {
  252.          this.enablePrincipalPrivilegeHelper(var3, var2 + 1, (Principal)null, (Object)null);
  253.          this.enableScopePrivilegeHelper(var3, var2 + 1, (Object)null, false, (Principal)null);
  254.       }
  255.    }
  256.  
  257.    Object setScopePrivilegeAssistant(int var1) {
  258.       return this.enableScopePrivilegeHelper(theSystemTarget, var1 + 1, (Object)null, true, (Principal)null);
  259.    }
  260.  
  261.    Object setScopePrivilegeAssistant(int var1, String var2) {
  262.       Target var3 = Target.findTarget(var2);
  263.       if (var3 == null) {
  264.          throw new ForbiddenTargetException(var2 + " target not found");
  265.       } else {
  266.          this.enablePrincipalPrivilegeHelper(var3, var1 + 1, (Principal)null, (Object)null);
  267.          return this.enableScopePrivilegeHelper(var3, var1 + 1, (Object)null, true, (Principal)null);
  268.       }
  269.    }
  270.  
  271.    private void enablePrincipalPrivilegeHelper(Target var1, int var2, Principal var3, Object var4) {
  272.       Principal var6 = null;
  273.       Target var7 = Target.findTarget(var1);
  274.       if (var7 != var1) {
  275.          throw new ForbiddenTargetException(var1 + " is not a registered target");
  276.       } else {
  277.          Principal[] var5 = this.getClassPrincipalsFromStackUnsafeJava(var2 + 1);
  278.          if (var3 != null) {
  279.             int var8 = var5.length;
  280.  
  281.             while(var8-- > 0) {
  282.                if (var5[var8].equals(var3) && (var5[var8].isCert() || var5[var8].isCertFingerprint())) {
  283.                   var6 = var5[var8];
  284.                   break;
  285.                }
  286.             }
  287.  
  288.             if (var6 == null) {
  289.                Target var9 = Target.findTarget("Impersonator");
  290.                this.checkPrivilegeEnabled(var9);
  291.                var6 = var3;
  292.                var5 = new Principal[]{var3};
  293.             }
  294.          }
  295.  
  296.          if (!this.isPermissionGranted(var1, var5, var4)) {
  297.             if (var6 == null) {
  298.                if (var5.length == 0) {
  299.                   throw new ForbiddenTargetException("request's caller has no principal!");
  300.                }
  301.  
  302.                var6 = var5[0];
  303.             }
  304.  
  305.             Object var14 = UpdateLock;
  306.             synchronized(var14){}
  307.  
  308.             try {
  309.                if (!this.isPermissionGranted(var1, var5, var4)) {
  310.                   Privilege var13 = var1.enablePrivilege(var6, var4);
  311.                   if (!var13.isAllowed() && var13.getDuration() == 1) {
  312.                      throw new ForbiddenTargetException("User didn't grant the " + var1.getName() + " privilege.");
  313.                   }
  314.  
  315.                   this.registerPrincipalAndSetPrivileges(var6, var1, var13);
  316.                   if (theDebugLevel > 0) {
  317.                      System.out.println("Privilege table modified for: " + var6.toVerboseString() + " for target " + var1 + " Privilege " + var13);
  318.                   }
  319.  
  320.                   if (var6.savePrincipalPermanently() && var13.getDuration() == 2 && !var6.equals(theUnsignedPrincipal)) {
  321.                      this.save();
  322.                   }
  323.  
  324.                   if (!var13.isForbidden()) {
  325.                      return;
  326.                   }
  327.  
  328.                   throw new ForbiddenTargetException("User didn't grant the " + var1.getName() + " privilege.");
  329.                }
  330.             } catch (Throwable var12) {
  331.                throw var12;
  332.             }
  333.  
  334.          }
  335.       }
  336.    }
  337.  
  338.    private boolean isPermissionGranted(Target var1, Principal[] var2, Object var3) {
  339.       int var4 = this.getPrincipalPrivilege(var1, var2, var3);
  340.       switch (var4) {
  341.          case 0:
  342.          default:
  343.             throw new ForbiddenTargetException("access to target denied");
  344.          case 1:
  345.             return true;
  346.          case 2:
  347.             return false;
  348.       }
  349.    }
  350.  
  351.    private Object enableScopePrivilegeHelper(Target var1, int var2, Object var3, boolean var4, Principal var5) {
  352.       Target var8 = Target.findTarget(var1);
  353.       if (var8 != var1) {
  354.          throw new ForbiddenTargetException(var1 + " is not a registered target");
  355.       } else {
  356.          if (var5 != null) {
  357.             this.checkPrivilegeGranted(var1, var5, var3);
  358.          } else {
  359.             this.checkPrivilegeGranted(var1, var2 + 1, var3);
  360.          }
  361.  
  362.          PrivilegeTable var6 = this.getPrivilegeTableFromStackUnsafe(var2 + 1, !var4);
  363.          if (var4) {
  364.             if (var6 != null) {
  365.                var6 = (PrivilegeTable)var6.clone();
  366.             } else {
  367.                var6 = new PrivilegeTable();
  368.             }
  369.          }
  370.  
  371.          Privilege var7 = Privilege.findPrivilege(1, 0);
  372.          this.updatePrivilegeTable(var1, var6, var7);
  373.          return var6;
  374.       }
  375.    }
  376.  
  377.    private void registerPrincipalAndSetPrivileges(Principal var1, Target var2, Privilege var3) {
  378.       this.registerPrincipal(var1);
  379.       PrivilegeTable var4 = (PrivilegeTable)this.itsPrinToMacroTargetPrivTable.get(var1);
  380.       var4.put(var2, var3);
  381.       var4 = (PrivilegeTable)this.itsPrinToPrivTable.get(var1);
  382.       this.updatePrivilegeTable(var2, var4, var3);
  383.    }
  384.  
  385.    private void updatePrivilegeTable(Target var1, PrivilegeTable var2, Privilege var3) {
  386.       Target[] var4 = var1.getFlattenedTargetAryUnsafe();
  387.       synchronized(var2){}
  388.  
  389.       try {
  390.          for(int var8 = var4.length; var8-- > 0; var2.put(var4[var8], var3)) {
  391.             Privilege var5 = var2.get(var4[var8]);
  392.             if (var5 != null) {
  393.                var3 = Privilege.add(var5, var3);
  394.             }
  395.          }
  396.       } catch (Throwable var10) {
  397.          throw var10;
  398.       }
  399.  
  400.    }
  401.  
  402.    public void revertPrivilege(Target var1) {
  403.       this.revertPrivilege(var1, 1);
  404.    }
  405.  
  406.    public static void revertPrivilege(String var0) {
  407.       PrivilegeManager var1 = getPrivilegeManager();
  408.       if (var1 == null) {
  409.          throw new ForbiddenTargetException("access to target denied");
  410.       } else {
  411.          Target var2 = Target.findTarget(var0);
  412.          if (var2 == null) {
  413.             throw new ForbiddenTargetException(var0 + " target not found");
  414.          } else {
  415.             var1.revertPrivilege(var2, 1);
  416.          }
  417.       }
  418.    }
  419.  
  420.    void revertPrivilege() {
  421.       PrivilegeTable var1 = this.getPrivilegeTableFromStackUnsafe(1, true);
  422.       synchronized(var1){}
  423.  
  424.       try {
  425.          var1.clear();
  426.       } catch (Throwable var4) {
  427.          throw var4;
  428.       }
  429.  
  430.    }
  431.  
  432.    private void revertPrivilege(Target var1, int var2) {
  433.       Target var3 = Target.findTarget(var1);
  434.       if (var3 != var1) {
  435.          throw new ForbiddenTargetException(var1 + " is not a registered target");
  436.       } else {
  437.          PrivilegeTable var4 = this.getPrivilegeTableFromStackUnsafe(var2 + 1, true);
  438.          synchronized(var4){}
  439.  
  440.          try {
  441.             var4.put(var1, Privilege.findPrivilege(2, 0));
  442.          } catch (Throwable var7) {
  443.             throw var7;
  444.          }
  445.  
  446.       }
  447.    }
  448.  
  449.    public void disablePrivilege(Target var1) {
  450.       this.disablePrivilege(var1, 1);
  451.    }
  452.  
  453.    public static void disablePrivilege(String var0) {
  454.       PrivilegeManager var1 = getPrivilegeManager();
  455.       if (var1 == null) {
  456.          throw new ForbiddenTargetException("access to target denied");
  457.       } else {
  458.          Target var2 = Target.findTarget(var0);
  459.          if (var2 == null) {
  460.             throw new ForbiddenTargetException(var0 + " target not found");
  461.          } else {
  462.             var1.disablePrivilege(var2, 1);
  463.          }
  464.       }
  465.    }
  466.  
  467.    private void disablePrivilege(Target var1, int var2) {
  468.       Target var3 = Target.findTarget(var1);
  469.       if (var3 != var1) {
  470.          throw new ForbiddenTargetException(var1 + " is not a registered target");
  471.       } else {
  472.          PrivilegeTable var4 = this.getPrivilegeTableFromStackUnsafe(var2 + 1, true);
  473.          var4.put(var1, Privilege.findPrivilege(0, 0));
  474.       }
  475.    }
  476.  
  477.    private int getPrincipalPrivilege(Target var1, int var2) {
  478.       return this.getPrincipalPrivilege(var1, var2 + 1, (Object)null);
  479.    }
  480.  
  481.    private int getPrincipalPrivilege(Target var1, Principal[] var2) {
  482.       return this.getPrincipalPrivilege(var1, (Principal[])var2, (Object)null);
  483.    }
  484.  
  485.    private int getPrincipalPrivilege(Target var1, int var2, Object var3) {
  486.       Principal[] var4 = this.getClassPrincipalsFromStackUnsafeJava(var2 + 1);
  487.       return this.getPrincipalPrivilege(var1, var4, var3);
  488.    }
  489.  
  490.    private int getPrincipalPrivilege(Target var1, Principal[] var2, Object var3) {
  491.       boolean var5 = false;
  492.       int var6 = var2.length;
  493.  
  494.       while(var6-- > 0) {
  495.          Privilege var4 = this.getPrincipalPrivilege(var1, var2[var6], var3);
  496.          if (var4 != null) {
  497.             switch (var4.getPermission()) {
  498.                case 0:
  499.                default:
  500.                   return 0;
  501.                case 1:
  502.                   var5 = true;
  503.                case 2:
  504.             }
  505.          }
  506.       }
  507.  
  508.       if (var5) {
  509.          return 1;
  510.       } else {
  511.          return 2;
  512.       }
  513.    }
  514.  
  515.    Privilege getPrincipalPrivilege(Target var1, Principal var2, Object var3) {
  516.       PrivilegeTable var4 = (PrivilegeTable)this.itsPrinToPrivTable.get(var2);
  517.       if (var4 == null) {
  518.          return null;
  519.       } else {
  520.          Target var6 = Target.findTarget(var1);
  521.          if (var6 != var1) {
  522.             return null;
  523.          } else {
  524.             Privilege var5;
  525.             if (var1 instanceof ParameterizedTarget) {
  526.                ParameterizedTarget var7 = (ParameterizedTarget)var1;
  527.                var5 = var7.getPrincipalPrivilege(var2, var3);
  528.             } else {
  529.                var5 = var4.get(var1);
  530.             }
  531.  
  532.             return var5;
  533.          }
  534.       }
  535.    }
  536.  
  537.    public static void checkPrivilegeGranted(String var0) {
  538.       PrivilegeManager var1 = getPrivilegeManager();
  539.       if (var1 == null) {
  540.          throw new ForbiddenTargetException("access to target denied");
  541.       } else {
  542.          Target var2 = Target.findTarget(var0);
  543.          if (var2 == null) {
  544.             throw new ForbiddenTargetException(var0 + " target not found");
  545.          } else {
  546.             var1.checkPrivilegeGranted(var2, 1, (Object)null);
  547.          }
  548.       }
  549.    }
  550.  
  551.    public void checkPrivilegeGranted(Target var1) {
  552.       this.checkPrivilegeGranted(var1, 1, (Object)null);
  553.    }
  554.  
  555.    private void checkPrivilegeGranted(Target var1, int var2) {
  556.       this.checkPrivilegeGranted(var1, var2 + 1, (Object)null);
  557.    }
  558.  
  559.    public void checkPrivilegeGranted(Target var1, Object var2) {
  560.       this.checkPrivilegeGranted(var1, 1, var2);
  561.    }
  562.  
  563.    private void checkPrivilegeGranted(Target var1, int var2, Object var3) {
  564.       int var4 = this.getPrincipalPrivilege(var1, var2 + 1, var3);
  565.       if (var4 != 1) {
  566.          throw new ForbiddenTargetException("access to target denied");
  567.       }
  568.    }
  569.  
  570.    public void checkPrivilegeGranted(Target var1, Principal var2, Object var3) {
  571.       Principal[] var4 = new Principal[]{var2};
  572.       int var5 = this.getPrincipalPrivilege(var1, var4, var3);
  573.       if (var5 != 1) {
  574.          throw new ForbiddenTargetException("access to target denied");
  575.       }
  576.    }
  577.  
  578.    private boolean matchPrincipal(Principal var1, Principal[] var2) {
  579.       int var3 = var2.length;
  580.  
  581.       while(var3-- > 0) {
  582.          if (var1.equals(var2[var3])) {
  583.             return true;
  584.          }
  585.       }
  586.  
  587.       return false;
  588.    }
  589.  
  590.    public boolean isCalledByPrincipal(Principal var1, int var2) {
  591.       Principal[] var3 = this.getClassPrincipalsFromStackUnsafeJava(var2 + 1);
  592.       return var3 == null ? false : this.matchPrincipal(var1, var3);
  593.    }
  594.  
  595.    public boolean isCalledByPrincipal(Principal var1) {
  596.       return this.isCalledByPrincipal(var1, 2);
  597.    }
  598.  
  599.    public static Principal getSystemPrincipal() {
  600.       if (theSystemPrincipal == null) {
  601.          init();
  602.       }
  603.  
  604.       return theSystemPrincipal;
  605.    }
  606.  
  607.    public static PrivilegeManager getPrivilegeManager() {
  608.       return AppletSecurity.getPrivilegeManager();
  609.    }
  610.  
  611.    private static Principal[] getSystemPrincipals() {
  612.       try {
  613.          return (Principal[])theSystemPrincipalAry.clone();
  614.       } catch (CloneNotSupportedException var0) {
  615.          throw new ForbiddenTargetException("internal error: unable to clone System Principal");
  616.       }
  617.    }
  618.  
  619.    private static Principal[] getSystemPrincipalsUnsafe() {
  620.       return theSystemPrincipalAry;
  621.    }
  622.  
  623.    private static Principal[] getUnsignedPrincipalArray() {
  624.       try {
  625.          return (Principal[])theUnsignedPrincipalAry.clone();
  626.       } catch (CloneNotSupportedException var0) {
  627.          throw new ForbiddenTargetException("internal error: unable to clone Unsigned Principal");
  628.       }
  629.    }
  630.  
  631.    private static Principal[] getUnsignedPrincipalsUnsafe() {
  632.       return theUnsignedPrincipalAry;
  633.    }
  634.  
  635.    static Principal getUnsignedPrincipal() {
  636.       return theUnsignedPrincipal;
  637.    }
  638.  
  639.    private static Principal[] getUnknownPrincipalArrayUnsafe() {
  640.       return theUnknownPrincipalAry;
  641.    }
  642.  
  643.    static Principal[] getUnknownPrincipalArray() {
  644.       try {
  645.          return (Principal[])theUnknownPrincipalAry.clone();
  646.       } catch (CloneNotSupportedException var0) {
  647.          throw new ForbiddenTargetException("internal error: unable to clone Unknown Principal");
  648.       }
  649.    }
  650.  
  651.    static Principal getUnknownPrincipal() {
  652.       return theUnknownPrincipal;
  653.    }
  654.  
  655.    public static Principal[] getMyPrincipals() {
  656.       PrivilegeManager var0 = getPrivilegeManager();
  657.       return var0 == null ? null : var0.getClassPrincipalsFromStack(1);
  658.    }
  659.  
  660.    public Principal[] getClassPrincipals(Class var1) {
  661.       Principal[] var2 = this.getClassPrincipalsUnsafeJava(var1);
  662.  
  663.       try {
  664.          return (Principal[])var2.clone();
  665.       } catch (CloneNotSupportedException var3) {
  666.          throw new ForbiddenTargetException("internal error: unable to clone Principal");
  667.       }
  668.    }
  669.  
  670.    public boolean hasPrincipal(Class var1, Principal var2) {
  671.       Principal[] var3 = this.getClassPrincipalsUnsafeJava(var1);
  672.       int var4 = var3.length;
  673.  
  674.       while(var4-- > 0) {
  675.          if (var3[var4].equals(var2)) {
  676.             return true;
  677.          }
  678.       }
  679.  
  680.       return false;
  681.    }
  682.  
  683.    public int comparePrincipalArray(Principal[] var1, Principal[] var2) {
  684.       Hashtable var3 = new Hashtable();
  685.       Integer var4 = new Integer(1);
  686.       Integer var5 = new Integer(0);
  687.       int var8 = var2.length;
  688.  
  689.       while(var8-- > 0) {
  690.          var3.put(var2[var8], var4);
  691.       }
  692.  
  693.       int var9 = var1.length;
  694.  
  695.       while(var9-- > 0) {
  696.          Principal var7 = var1[var9];
  697.          Integer var6 = (Integer)var3.get(var7);
  698.          if (var6 == null) {
  699.             return 1;
  700.          }
  701.  
  702.          if (var6 == var4) {
  703.             var3.put(var7, var5);
  704.          }
  705.       }
  706.  
  707.       Enumeration var10 = var3.keys();
  708.  
  709.       while(var10.hasMoreElements()) {
  710.          Object var12 = var10.nextElement();
  711.          Integer var11 = (Integer)var3.get(var12);
  712.          if (var11 == var4) {
  713.             return -1;
  714.          }
  715.       }
  716.  
  717.       return 0;
  718.    }
  719.  
  720.    public Principal[] intersectPrincipalArray(Principal[] var1, Principal[] var2) {
  721.       boolean[] var3 = new boolean[var1.length];
  722.       int var4 = 0;
  723.  
  724.       for(int var5 = 0; var5 < var1.length; ++var5) {
  725.          for(int var6 = 0; var6 < var2.length; ++var6) {
  726.             if (var1[var5].equals(var2[var6])) {
  727.                var3[var5] = true;
  728.                ++var4;
  729.                break;
  730.             }
  731.          }
  732.       }
  733.  
  734.       Principal[] var9 = new Principal[var4];
  735.       int var7 = 0;
  736.  
  737.       for(int var8 = 0; var8 < var3.length; ++var8) {
  738.          if (var3[var8]) {
  739.             var9[var7++] = var1[var8];
  740.          }
  741.       }
  742.  
  743.       return var9;
  744.    }
  745.  
  746.    public boolean canExtendTrust(Principal[] var1, Principal[] var2) {
  747.       Principal[] var3 = this.intersectPrincipalArray(var1, var2);
  748.       if (var3.length == var1.length) {
  749.          return true;
  750.       } else if (var3.length != 0 && var3.length == var1.length - 1) {
  751.          for(int var4 = 0; var4 < var3.length; ++var4) {
  752.             if (var3[var4].isCodebase()) {
  753.                return false;
  754.             }
  755.          }
  756.  
  757.          int var5 = 0;
  758.  
  759.          for(int var6 = 0; var6 < var1.length; ++var6) {
  760.             if (var1[var6].isCodebase()) {
  761.                ++var5;
  762.             }
  763.          }
  764.  
  765.          if (var5 != 1) {
  766.             return false;
  767.          } else {
  768.             return true;
  769.          }
  770.       } else {
  771.          return false;
  772.       }
  773.    }
  774.  
  775.    public boolean checkMatchPrincipal(Class var1, int var2) {
  776.       return this.comparePrincipalArray(this.getClassPrincipalsFromStack(var2 + 1), this.getClassPrincipalsUnsafeJava(var1)) != 1;
  777.    }
  778.  
  779.    public boolean checkMatchPrincipal(Principal var1, int var2) {
  780.       Principal[] var3 = new Principal[]{var1};
  781.       return this.comparePrincipalArray(var3, this.getClassPrincipalsFromStack(var2 + 1)) != 1;
  782.    }
  783.  
  784.    public boolean checkMatchPrincipal(Class var1) {
  785.       return this.checkMatchPrincipal((Class)var1, 1);
  786.    }
  787.  
  788.    public boolean checkMatchPrincipalAlways() {
  789.       return SecurityManager.checksMatchPrincipalAlways(1);
  790.    }
  791.  
  792.    public Principal[] getClassPrincipalsFromStack(int var1) {
  793.       Principal[] var2 = this.getClassPrincipalsFromStackUnsafeJava(var1 + 1);
  794.  
  795.       try {
  796.          return (Principal[])var2.clone();
  797.       } catch (CloneNotSupportedException var3) {
  798.          throw new ForbiddenTargetException("internal error: unable to clone Principal");
  799.       }
  800.    }
  801.  
  802.    private Principal[] getClassPrincipalsFromStackUnsafeJava(int var1) {
  803.       Principal[] var2 = this.getClassPrincipalsFromStackUnsafe(var1 + 1);
  804.       if (var2 == null) {
  805.          if (!this.getJavaSecurityEnabled()) {
  806.             System.out.println("Java Navigator Beta internal error message: Defaulting to system principal");
  807.             return getSystemPrincipalsUnsafe();
  808.          } else {
  809.             return getUnknownPrincipalArray();
  810.          }
  811.       } else {
  812.          return var2;
  813.       }
  814.    }
  815.  
  816.    private Principal[] getClassPrincipalsUnsafeJava(Class var1) {
  817.       Principal[] var2 = this.getClassPrincipalsUnsafe(var1);
  818.       if (var2 == null) {
  819.          if (!this.getJavaSecurityEnabled()) {
  820.             System.out.println("Java Navigator Beta internal error message: Defaulting to system principal");
  821.             return getSystemPrincipalsUnsafe();
  822.          } else {
  823.             return getUnknownPrincipalArray();
  824.          }
  825.       } else {
  826.          return var2;
  827.       }
  828.    }
  829.  
  830.    boolean isSecurePrincipalFromStack(Class[] var1) {
  831.       for(int var3 = 0; var3 < var1.length; ++var3) {
  832.          Principal[] var2 = this.getClassPrincipalsUnsafe(var1[var3]);
  833.          if (var2 == null) {
  834.             return false;
  835.          }
  836.  
  837.          if (!theSystemPrincipal.equals(var2[0])) {
  838.             if (var2[0].isCodebase()) {
  839.                return false;
  840.             }
  841.  
  842.             return true;
  843.          }
  844.       }
  845.  
  846.       return true;
  847.    }
  848.  
  849.    String getNonSystemPrincipalFromStack(Class[] var1) {
  850.       for(int var3 = 0; var3 < var1.length; ++var3) {
  851.          Principal[] var2 = this.getClassPrincipalsUnsafe(var1[var3]);
  852.          if (var2 == null) {
  853.             return UserDialogHelper.getUnsignedAppletStr();
  854.          }
  855.  
  856.          if (!theSystemPrincipal.equals(var2[0])) {
  857.             if (var2[0].isCodebase()) {
  858.                return UserDialogHelper.getUnsignedAppletStr();
  859.             }
  860.  
  861.             return UserDialogHelper.getSignedAppletStr(var2[0].getVendor());
  862.          }
  863.       }
  864.  
  865.       return null;
  866.    }
  867.  
  868.    PrivilegeTable getPrivilegeTableFromStack(int var1) {
  869.       PrivilegeTable var2 = this.getPrivilegeTableFromStackUnsafe(var1 + 1, false);
  870.       return var2 == null ? null : (PrivilegeTable)var2.clone();
  871.    }
  872.  
  873.    public PrivilegeTable getPrivilegeTableFromStack() {
  874.       return this.getPrivilegeTableFromStack(2);
  875.    }
  876.  
  877.    private native Principal[] getClassPrincipalsFromStackUnsafe(int var1);
  878.  
  879.    private native Principal[] getClassPrincipalsUnsafe(Class var1);
  880.  
  881.    private native PrivilegeTable getPrivilegeTableFromStackUnsafe(int var1, boolean var2);
  882.  
  883.    native boolean getJavaSecurityEnabled();
  884.  
  885.    synchronized native int getPrivilegeFromUser(String var1, String var2, String var3, boolean var4);
  886.  
  887.    native boolean showDocument(String var1, String var2);
  888.  
  889.    native boolean isJavaSecurityDefaultTo30Enabled();
  890.  
  891.    native boolean getBoolPref(String var1);
  892.  
  893.    private native String getWHFileName(String var1, int var2);
  894.  
  895.    native boolean picsCanUserEnableAdditionalJavaCapabilities();
  896.  
  897.    private native void reloadCookiesIntoBrowser0();
  898.  
  899.    public void reloadCookiesIntoBrowser() {
  900.       checkPrivilegeEnabled("CookieAccess");
  901.       this.reloadCookiesIntoBrowser0();
  902.    }
  903.  
  904.    private native void reloadSignonsIntoBrowser0();
  905.  
  906.    public void reloadSignonsIntoBrowser() {
  907.       checkPrivilegeEnabled("SignonAccess");
  908.       this.reloadSignonsIntoBrowser0();
  909.    }
  910.  
  911.    private native void flushCookiesFromBrowser0();
  912.  
  913.    public void flushCookiesFromBrowser() {
  914.       checkPrivilegeEnabled("CookieAccess");
  915.       this.flushCookiesFromBrowser0();
  916.    }
  917.  
  918.    private native void flushSignonsFromBrowser0();
  919.  
  920.    public void flushSignonsFromBrowser() {
  921.       checkPrivilegeEnabled("SignonAccess");
  922.       this.flushSignonsFromBrowser0();
  923.    }
  924.  
  925.    public Principal[] getAllPrincipals() {
  926.       int var1 = 0;
  927.       Hashtable var6 = this.itsPrinToMacroTargetPrivTable;
  928.       synchronized(var6){}
  929.  
  930.       Object var5;
  931.       try {
  932.          int var8 = this.itsPrinToMacroTargetPrivTable.size();
  933.          if (var8 != 0) {
  934.             Principal[] var2 = new Principal[var8];
  935.  
  936.             Principal var4;
  937.             for(Enumeration var3 = this.itsPrinToMacroTargetPrivTable.keys(); var3.hasMoreElements(); var2[var1++] = var4) {
  938.                var4 = (Principal)var3.nextElement();
  939.             }
  940.  
  941.             return var2;
  942.          }
  943.  
  944.          var5 = null;
  945.       } catch (Throwable var10) {
  946.          throw var10;
  947.       }
  948.  
  949.       return (Principal[])var5;
  950.    }
  951.  
  952.    static String getAllPrincipalsString() {
  953.       PrivilegeManager var0 = getPrivilegeManager();
  954.       if (var0 == null) {
  955.          return null;
  956.       } else {
  957.          Principal[] var1 = var0.getAllPrincipals();
  958.          if (var1 == null) {
  959.             return null;
  960.          } else {
  961.             boolean var2 = true;
  962.             StringBuffer var3 = new StringBuffer();
  963.             int var4 = var1.length;
  964.  
  965.             while(var4-- > 0) {
  966.                if (var0.principalHasPrivileges(var1[var4])) {
  967.                   if (var2) {
  968.                      var3.append("\"" + var1[var4].toString() + "\"");
  969.                      var2 = false;
  970.                   } else {
  971.                      var3.append(",\"" + var1[var4].toString() + "\"");
  972.                   }
  973.                }
  974.             }
  975.  
  976.             if (var2) {
  977.                return null;
  978.             } else {
  979.                return var3.toString();
  980.             }
  981.          }
  982.       }
  983.    }
  984.  
  985.    private Principal getPrincipalFromString(String var1) {
  986.       Principal[] var2 = this.getAllPrincipals();
  987.       if (var2 == null) {
  988.          return null;
  989.       } else {
  990.          int var3 = var2.length;
  991.  
  992.          while(var3-- > 0) {
  993.             if (var1.equals(var2[var3].toString())) {
  994.                return var2[var3];
  995.             }
  996.          }
  997.  
  998.          return null;
  999.       }
  1000.    }
  1001.  
  1002.    boolean principalHasPrivileges(Principal var1) {
  1003.       Hashtable var3 = this.itsPrinToMacroTargetPrivTable;
  1004.       synchronized(var3){}
  1005.  
  1006.       PrivilegeTable var2;
  1007.       try {
  1008.          var2 = (PrivilegeTable)this.itsPrinToMacroTargetPrivTable.get(var1);
  1009.       } catch (Throwable var5) {
  1010.          throw var5;
  1011.       }
  1012.  
  1013.       return var2 != null && var2.size() != 0;
  1014.    }
  1015.  
  1016.    static String[] getTargetsWithPrivileges(String var0) {
  1017.       PrivilegeManager var1 = getPrivilegeManager();
  1018.       if (var1 == null) {
  1019.          return null;
  1020.       } else {
  1021.          Principal var2 = var1.getPrincipalFromString(var0);
  1022.          if (var2 == null) {
  1023.             return null;
  1024.          } else {
  1025.             StringBuffer var8 = new StringBuffer();
  1026.             StringBuffer var9 = new StringBuffer();
  1027.             StringBuffer var10 = new StringBuffer();
  1028.             String[] var11 = new String[3];
  1029.             Hashtable var12 = var1.itsPrinToMacroTargetPrivTable;
  1030.             synchronized(var12){}
  1031.  
  1032.             PrivilegeTable var3;
  1033.             try {
  1034.                var3 = (PrivilegeTable)var1.itsPrinToMacroTargetPrivTable.get(var2);
  1035.             } catch (Throwable var14) {
  1036.                throw var14;
  1037.             }
  1038.  
  1039.             Enumeration var6 = var3.keys();
  1040.  
  1041.             while(var6.hasMoreElements()) {
  1042.                Target var4 = (Target)var6.nextElement();
  1043.                Privilege var5 = var3.get(var4);
  1044.                String var7 = var4.getDescription();
  1045.                if (var5.isAllowed()) {
  1046.                   if (var5.getDuration() == 2) {
  1047.                      var8.append("<option>" + var7);
  1048.                   } else {
  1049.                      var9.append("<option>" + var7);
  1050.                   }
  1051.                } else if (var5.isForbidden()) {
  1052.                   var10.append("<option>" + var7);
  1053.                }
  1054.             }
  1055.  
  1056.             var11[0] = var8.toString();
  1057.             var11[1] = var9.toString();
  1058.             var11[2] = var10.toString();
  1059.             return var11;
  1060.          }
  1061.       }
  1062.    }
  1063.  
  1064.    private Target getTargetFromString(Principal var1, String var2) {
  1065.       PrivilegeTable var3 = (PrivilegeTable)this.itsPrinToMacroTargetPrivTable.get(var1);
  1066.       Enumeration var5 = var3.keys();
  1067.  
  1068.       while(var5.hasMoreElements()) {
  1069.          Target var4 = (Target)var5.nextElement();
  1070.          if (var2.equals(var4.getDescription())) {
  1071.             return var4;
  1072.          }
  1073.       }
  1074.  
  1075.       return null;
  1076.    }
  1077.  
  1078.    static String[] getTargetDetails(String var0) {
  1079.       PrivilegeManager var1 = getPrivilegeManager();
  1080.       if (var1 == null) {
  1081.          return null;
  1082.       } else {
  1083.          Target var2 = Target.getTargetFromDescription(var0);
  1084.          if (var2 == null) {
  1085.             return null;
  1086.          } else {
  1087.             StringBuffer var3 = new StringBuffer();
  1088.             Target[] var4 = var2.getFlattenedTargetAryUnsafe();
  1089.             int var5 = var4.length;
  1090.  
  1091.             while(var5-- > 0) {
  1092.                var3.append("<option>" + var4[var5].getDescription() + " (" + var4[var5].getRisk() + ")");
  1093.             }
  1094.  
  1095.             String[] var6 = new String[]{var3.toString(), var2.getRisk()};
  1096.             return var6;
  1097.          }
  1098.       }
  1099.    }
  1100.  
  1101.    static boolean removePrincipal(String var0) {
  1102.       PrivilegeManager var1 = getPrivilegeManager();
  1103.       if (var1 == null) {
  1104.          return false;
  1105.       } else {
  1106.          Principal var2 = var1.getPrincipalFromString(var0);
  1107.          if (var2 == null) {
  1108.             return false;
  1109.          } else {
  1110.             try {
  1111.                var1.removeAllParameterizedTargets(var2);
  1112.                var1.unregisterPrincipal(var2);
  1113.             } catch (Exception var4) {
  1114.                System.out.println("Unable to delete principal " + var2 + " " + var4);
  1115.                ((Throwable)var4).printStackTrace(System.out);
  1116.                return false;
  1117.             }
  1118.  
  1119.             var1.save();
  1120.             return true;
  1121.          }
  1122.       }
  1123.    }
  1124.  
  1125.    static boolean removePrincipalsPrivilege(String var0, String var1) {
  1126.       PrivilegeManager var2 = getPrivilegeManager();
  1127.       if (var2 == null) {
  1128.          return false;
  1129.       } else {
  1130.          Principal var3 = var2.getPrincipalFromString(var0);
  1131.          if (var3 == null) {
  1132.             return false;
  1133.          } else {
  1134.             Target var4 = var2.getTargetFromString(var3, var1);
  1135.             if (var4 == null) {
  1136.                return false;
  1137.             } else {
  1138.                var2.remove(var3, var4);
  1139.                var2.save();
  1140.                return true;
  1141.             }
  1142.          }
  1143.       }
  1144.    }
  1145.  
  1146.    private void remove(Principal var1, Target var2) {
  1147.       if (this.itsPrinToMacroTargetPrivTable == null) {
  1148.          if (theDebugLevel > 0) {
  1149.             System.out.println("itsPrinToMacroTargetPrivTable is null " + var1);
  1150.          }
  1151.  
  1152.       } else {
  1153.          Hashtable var7 = this.itsPrinToMacroTargetPrivTable;
  1154.          synchronized(var7){}
  1155.  
  1156.          PrivilegeTable var4;
  1157.          try {
  1158.             var4 = (PrivilegeTable)this.itsPrinToMacroTargetPrivTable.get(var1);
  1159.             if (var4 == null) {
  1160.                if (theDebugLevel > 0) {
  1161.                   System.out.println("Principal doesn't have privileges " + var1);
  1162.                }
  1163.  
  1164.                return;
  1165.             }
  1166.  
  1167.             if (var2 instanceof ParameterizedTarget) {
  1168.                ParameterizedTarget var9 = (ParameterizedTarget)var2;
  1169.                var9.unregisterPrincipal(var1);
  1170.             }
  1171.  
  1172.             var4.remove(var2);
  1173.          } catch (Throwable var15) {
  1174.             throw var15;
  1175.          }
  1176.  
  1177.          var7 = this.itsPrinToPrivTable;
  1178.          synchronized(var7){}
  1179.  
  1180.          try {
  1181.             PrivilegeTable var17 = new PrivilegeTable();
  1182.             this.itsPrinToPrivTable.put(var1, var17);
  1183.             Enumeration var3 = var4.keys();
  1184.  
  1185.             while(var3.hasMoreElements()) {
  1186.                Target var6 = (Target)var3.nextElement();
  1187.                Privilege var5 = var4.get(var6);
  1188.                this.updatePrivilegeTable(var6, var17, var5);
  1189.             }
  1190.          } catch (Throwable var14) {
  1191.             throw var14;
  1192.          }
  1193.  
  1194.       }
  1195.    }
  1196.  
  1197.    void removeAllParameterizedTargets(Principal var1) {
  1198.       Hashtable var5 = this.itsPrinToPrivTable;
  1199.       synchronized(var5){}
  1200.  
  1201.       try {
  1202.          PrivilegeTable var3 = (PrivilegeTable)this.itsPrinToPrivTable.get(var1);
  1203.          Enumeration var2 = var3.keys();
  1204.  
  1205.          while(var2.hasMoreElements()) {
  1206.             Target var4 = (Target)var2.nextElement();
  1207.             if (var4 instanceof ParameterizedTarget) {
  1208.                ParameterizedTarget var7 = (ParameterizedTarget)var4;
  1209.                var7.unregisterPrincipal(var1);
  1210.             }
  1211.          }
  1212.       } catch (Throwable var9) {
  1213.          throw var9;
  1214.       }
  1215.  
  1216.    }
  1217.  
  1218.    String getArchiveFileName() {
  1219.       if (SignedAppletDBName == null) {
  1220.          SignedAppletDBName = this.getWHFileName("", 1);
  1221.       }
  1222.  
  1223.       return SignedAppletDBName;
  1224.    }
  1225.  
  1226.    String getArchiveFileName(String var1) {
  1227.       return this.getWHFileName(var1, 1);
  1228.    }
  1229.  
  1230.    private synchronized void save() {
  1231.       SecurityManager.enablePrivilege("UniversalFileWrite");
  1232.       String var2 = this.getArchiveFileName();
  1233.  
  1234.       FileOutputStream var1;
  1235.       try {
  1236.          var1 = new FileOutputStream(var2);
  1237.       } catch (FileNotFoundException var6) {
  1238.          System.err.println("Error1: can't open <" + var2 + "> to save java capabilities list");
  1239.          return;
  1240.       } catch (IOException var7) {
  1241.          System.err.println("Error2: can't open <" + var2 + "> to save java capabilities list");
  1242.          return;
  1243.       }
  1244.  
  1245.       try {
  1246.          this.save(var1);
  1247.       } catch (Exception var5) {
  1248.          System.err.println("Error: unable to save java capabilities list into <" + var2 + "> " + var5);
  1249.       }
  1250.  
  1251.       try {
  1252.          var1.close();
  1253.       } catch (IOException var4) {
  1254.          System.err.println("Error while saving java capabilities list into <" + var2 + ">");
  1255.       }
  1256.    }
  1257.  
  1258.    private void save(OutputStream var1) {
  1259.       Hashtable var10 = new Hashtable();
  1260.       Enumeration var4 = this.itsPrinToMacroTargetPrivTable.keys();
  1261.  
  1262.       while(var4.hasMoreElements()) {
  1263.          Principal var7 = (Principal)var4.nextElement();
  1264.          PrivilegeTable var6 = (PrivilegeTable)this.itsPrinToMacroTargetPrivTable.get(var7);
  1265.          synchronized(var6){}
  1266.  
  1267.          try {
  1268.             PrivilegeTable var11 = new PrivilegeTable();
  1269.             Enumeration var5 = var6.keys();
  1270.  
  1271.             while(var5.hasMoreElements()) {
  1272.                Target var9 = (Target)var5.nextElement();
  1273.                Privilege var8 = var6.get(var9);
  1274.                switch (var8.getDuration()) {
  1275.                   case 2:
  1276.                      if (theDebugLevel > 0) {
  1277.                         System.out.println("saving target: " + var9 + " privilege: " + var8);
  1278.                      }
  1279.  
  1280.                      var11.put(var9, var8);
  1281.                }
  1282.             }
  1283.  
  1284.             if (var11.size() > 0) {
  1285.                var10.put(var7, var11);
  1286.                if (theDebugLevel > 0) {
  1287.                   System.out.println("saving principal: " + var7);
  1288.                }
  1289.             }
  1290.          } catch (Throwable var18) {
  1291.             throw var18;
  1292.          }
  1293.       }
  1294.  
  1295.       Archive var2 = new Archive();
  1296.       Archiver var3 = new Archiver(var2);
  1297.  
  1298.       try {
  1299.          var3.archiveRootObject(var10);
  1300.       } catch (CodingException var17) {
  1301.          System.err.println("Internal error during archiving of Capabilities");
  1302.          ((Throwable)var17).printStackTrace(System.out);
  1303.          return;
  1304.       }
  1305.  
  1306.       try {
  1307.          var2.write(var1);
  1308.       } catch (Exception var16) {
  1309.          System.err.println("Error during serializing java Capabilities " + var16);
  1310.       }
  1311.    }
  1312.  
  1313.    boolean isSecurityInited() {
  1314.       return theSecurityInited;
  1315.    }
  1316.  
  1317.    private synchronized void load() {
  1318.       if (!theSecurityInited) {
  1319.          Object var1 = null;
  1320.          String var2 = this.getArchiveFileName();
  1321.          SecurityManager.enablePrivilege("UniversalFileRead");
  1322.  
  1323.          try {
  1324.             var6 = new FileInputStream(var2);
  1325.          } catch (Exception var5) {
  1326.             var6 = null;
  1327.          }
  1328.  
  1329.          if (var6 == null) {
  1330.             var2 = this.getArchiveFileName("0");
  1331.  
  1332.             try {
  1333.                var6 = new FileInputStream(var2);
  1334.             } catch (Exception var4) {
  1335.                return;
  1336.             }
  1337.          }
  1338.  
  1339.          this.load(var6, (Principal[])null);
  1340.  
  1341.          try {
  1342.             var6.close();
  1343.          } catch (IOException var3) {
  1344.             System.err.println("Error while reading java Capabilities file <" + var2 + ">");
  1345.             return;
  1346.          }
  1347.  
  1348.          theSecurityInited = true;
  1349.       }
  1350.    }
  1351.  
  1352.    private void load(InputStream var1, Principal[] var2) {
  1353.       Object var6 = null;
  1354.       Archive var3 = new Archive();
  1355.  
  1356.       try {
  1357.          var3.read(var1);
  1358.       } catch (Exception var18) {
  1359.          System.err.println("Error: unable to read java Capabilities from archive " + var18);
  1360.          return;
  1361.       }
  1362.  
  1363.       int[] var19 = var3.rootIdentifiers();
  1364.       Unarchiver var4 = new Unarchiver(var3);
  1365.  
  1366.       Object var5;
  1367.       try {
  1368.          var5 = var4.unarchiveIdentifier(var19[0]);
  1369.       } catch (Exception var17) {
  1370.          System.err.println("Error: old java capabilites list was lost " + var17);
  1371.          return;
  1372.       }
  1373.  
  1374.       if (var5 != null) {
  1375.          Hashtable var13 = (Hashtable)var5;
  1376.          Enumeration var7 = var13.keys();
  1377.  
  1378.          while(var7.hasMoreElements()) {
  1379.             Principal var15 = (Principal)var7.nextElement();
  1380.             PrivilegeTable var14 = (PrivilegeTable)var13.get(var15);
  1381.             if (theDebugLevel > 0) {
  1382.                System.out.println("loading principal " + var15);
  1383.             }
  1384.  
  1385.             this.registerPrincipal(var15);
  1386.             PrivilegeTable var9 = (PrivilegeTable)this.itsPrinToMacroTargetPrivTable.get(var15);
  1387.             Enumeration var8 = var14.keys();
  1388.  
  1389.             while(var8.hasMoreElements()) {
  1390.                Target var11 = (Target)var8.nextElement();
  1391.                Privilege var10 = var14.get(var11);
  1392.                if (theDebugLevel > 0) {
  1393.                   System.out.println("addng target: " + var11 + " with privilege: " + var10);
  1394.                }
  1395.  
  1396.                Target var12 = Target.findTarget(var11);
  1397.                if (var12 == null) {
  1398.                   if (theDebugLevel > 0) {
  1399.                      System.out.println("registering non-system target " + var11);
  1400.                   }
  1401.  
  1402.                   var12 = var11.registerTarget();
  1403.                }
  1404.  
  1405.                var10 = Privilege.findPrivilege(var10.getPermission(), var10.getDuration());
  1406.                if (var2 != null && !this.matchPrincipal(var12.getPrincipal(), var2)) {
  1407.                   throw new ForbiddenTargetException("None of principals in " + var2[0].toString() + " can modify privileges of Target: " + var12);
  1408.                }
  1409.  
  1410.                var9.put(var12, var10);
  1411.             }
  1412.          }
  1413.  
  1414.          this.explodePrivilege();
  1415.       }
  1416.    }
  1417.  
  1418.    private void explodePrivilege() {
  1419.       Enumeration var1 = this.itsPrinToMacroTargetPrivTable.keys();
  1420.  
  1421.       while(var1.hasMoreElements()) {
  1422.          Principal var4 = (Principal)var1.nextElement();
  1423.          PrivilegeTable var3 = (PrivilegeTable)this.itsPrinToMacroTargetPrivTable.get(var4);
  1424.          PrivilegeTable var7 = (PrivilegeTable)this.itsPrinToPrivTable.get(var4);
  1425.          Enumeration var2 = var3.keys();
  1426.  
  1427.          while(var2.hasMoreElements()) {
  1428.             Target var6 = (Target)var2.nextElement();
  1429.             Privilege var5 = var3.get(var6);
  1430.             this.updatePrivilegeTable(var6, var7, var5);
  1431.          }
  1432.       }
  1433.  
  1434.    }
  1435.  
  1436.    public synchronized boolean read(InputStream var1) {
  1437.       if (var1 == null) {
  1438.          return false;
  1439.       } else {
  1440.          PrivilegeManager var2 = getPrivilegeManager();
  1441.          if (var2 == null) {
  1442.             return false;
  1443.          } else {
  1444.             Principal[] var3 = var2.getClassPrincipalsFromStack(1);
  1445.             if (var3 == null) {
  1446.                return false;
  1447.             } else {
  1448.                this.load(var1, var3);
  1449.                return true;
  1450.             }
  1451.          }
  1452.       }
  1453.    }
  1454.  
  1455.    public synchronized boolean write(OutputStream var1) {
  1456.       this.save(var1);
  1457.       return true;
  1458.    }
  1459.  
  1460.    private boolean doesCallerHavePrivilegeToModifyPermission(Target var1, int var2) {
  1461.       PrivilegeManager var3 = getPrivilegeManager();
  1462.       return var3 == null ? false : var3.isCalledByPrincipal(var1.getPrincipal(), var2 + 1);
  1463.    }
  1464.  
  1465.    public void addPrivilege(Principal var1, Target var2, Privilege var3) {
  1466.       Target var4 = Target.findTarget(var2);
  1467.       if (var4 == null) {
  1468.          throw new ForbiddenTargetException(var2 + " is not a registered target");
  1469.       } else {
  1470.          var2 = var4;
  1471.          if (!this.doesCallerHavePrivilegeToModifyPermission(var4, 1)) {
  1472.             throw new ForbiddenTargetException("Principal " + var1 + " is not allowed to modify privileges of Target: " + var4);
  1473.          } else {
  1474.             Principal[] var5 = new Principal[]{var1};
  1475.             if (this.getPrincipalPrivilege(var4, var5) != 2) {
  1476.                throw new ForbiddenTargetException("Principal " + var1 + " already has privileges set for Target: " + var4);
  1477.             } else {
  1478.                Object var6 = UpdateLock;
  1479.                synchronized(var6){}
  1480.  
  1481.                try {
  1482.                   this.registerPrincipalAndSetPrivileges(var1, var2, var3);
  1483.                } catch (Throwable var8) {
  1484.                   throw var8;
  1485.                }
  1486.  
  1487.             }
  1488.          }
  1489.       }
  1490.    }
  1491.  
  1492.    public void modifyPrivilege(Principal var1, Target var2, Privilege var3) {
  1493.       Target var4 = Target.findTarget(var2);
  1494.       if (var4 == null) {
  1495.          throw new ForbiddenTargetException(var2 + " is not a registered target");
  1496.       } else {
  1497.          var2 = var4;
  1498.          if (!this.doesCallerHavePrivilegeToModifyPermission(var4, 1)) {
  1499.             throw new ForbiddenTargetException("Principal " + var1 + " is not allowed to modify privileges of Target: " + var4);
  1500.          } else {
  1501.             Object var5 = UpdateLock;
  1502.             synchronized(var5){}
  1503.  
  1504.             try {
  1505.                this.registerPrincipalAndSetPrivileges(var1, var2, var3);
  1506.             } catch (Throwable var7) {
  1507.                throw var7;
  1508.             }
  1509.  
  1510.          }
  1511.       }
  1512.    }
  1513.  
  1514.    public void removePrivilege(Principal var1, Target var2) {
  1515.       Target var3 = Target.findTarget(var2);
  1516.       if (var3 == null) {
  1517.          throw new ForbiddenTargetException(var2 + " is not a registered target");
  1518.       } else if (!this.doesCallerHavePrivilegeToModifyPermission(var3, 1)) {
  1519.          throw new ForbiddenTargetException("Principal " + var1 + " is not allowed to modify privileges of Target: " + var3);
  1520.       } else {
  1521.          this.remove(var1, var3);
  1522.       }
  1523.    }
  1524.  
  1525.    public PrivilegeTable getPrivilegeTable(Principal var1) {
  1526.       Hashtable var3 = this.itsPrinToMacroTargetPrivTable;
  1527.       synchronized(var3){}
  1528.  
  1529.       PrivilegeTable var2;
  1530.       try {
  1531.          var2 = (PrivilegeTable)this.itsPrinToMacroTargetPrivTable.get(var1);
  1532.       } catch (Throwable var5) {
  1533.          throw var5;
  1534.       }
  1535.  
  1536.       return var2 != null && var2.size() != 0 ? (PrivilegeTable)var2.clone() : null;
  1537.    }
  1538.  
  1539.    protected void dumpPrinToPrivTable() {
  1540.       checkPrivilegeEnabled("SuperUser");
  1541.       System.out.println("PrinToPrivTable");
  1542.       System.out.println("--------------");
  1543.       System.out.println("--------------");
  1544.       System.out.println("--------------");
  1545.       Enumeration var1 = this.itsPrinToPrivTable.keys();
  1546.  
  1547.       while(var1.hasMoreElements()) {
  1548.          Principal var3 = (Principal)var1.nextElement();
  1549.          var3.dump();
  1550.          System.out.println(var3.toVerboseString());
  1551.          PrivilegeTable var4 = (PrivilegeTable)this.itsPrinToPrivTable.get(var3);
  1552.          System.out.println("Granted Targets\n");
  1553.          Enumeration var2 = var4.keys();
  1554.  
  1555.          while(var2.hasMoreElements()) {
  1556.             Target var5 = (Target)var2.nextElement();
  1557.             Privilege var6 = var4.get(var5);
  1558.             System.out.println("-->" + var5.toString() + " -- " + var6.toString());
  1559.          }
  1560.  
  1561.          System.out.println("--------------");
  1562.       }
  1563.  
  1564.    }
  1565.  
  1566.    public void addTrustEntry(Privilege var1, int var2, String var3, Target var4) {
  1567.       checkPrivilegeEnabled("SuperUser");
  1568.       Principal var5 = new Principal(var2, var3);
  1569.       PrivilegeTable var6 = (PrivilegeTable)this.itsPrinToPrivTable.get(var5);
  1570.       PrivilegeTable var7 = (PrivilegeTable)this.itsPrinToMacroTargetPrivTable.get(var5);
  1571.       if (var6 != null) {
  1572.          Privilege var8 = var7.get(var4);
  1573.          if (var8 == null) {
  1574.             var8 = var6.get(var4);
  1575.          }
  1576.  
  1577.          if (var8 != null && var8.getPermission() == 0 && var1.getPermission() == 1) {
  1578.             throw new SecurityException("Illegal attempt to grant a privilege that has been denied");
  1579.          }
  1580.  
  1581.          var7.put(var4, var1);
  1582.          this.updatePrivilegeTable(var4, var6, var1);
  1583.       } else {
  1584.          this.registerPrincipalAndSetPrivileges(var5, var4, var1);
  1585.       }
  1586.  
  1587.       if (var1.getDuration() == 2) {
  1588.          this.save();
  1589.       }
  1590.  
  1591.    }
  1592. }
  1593.