home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1997 November / PCO1197.ISO / FilesBBS / WIN95 / NET_COM / N32E403.EXE / nav40l.z / java40.jar / netscape / security / PrivilegeManager.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-09-04  |  17.0 KB  |  1,245 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.    private Hashtable itsPrinToPrivTable = new Hashtable();
  23.    private Hashtable itsPrinToMacroTargetPrivTable = new Hashtable();
  24.    private static Principal theSystemPrincipal;
  25.    private static Principal[] theSystemPrincipalAry;
  26.    private static Target theSystemTarget;
  27.    private static boolean theSecurityInited;
  28.    private static Principal theUnsignedPrincipal;
  29.    private static Principal[] theUnsignedPrincipalAry;
  30.    private static Principal theUnknownPrincipal;
  31.    private static Principal[] theUnknownPrincipalAry;
  32.    static Object UpdateLock = new Object();
  33.    private static String SignedAppletDBName = null;
  34.  
  35.    private static native void initClass();
  36.  
  37.    private static void init() {
  38.       try {
  39.          theSystemPrincipal = Principal.createSystemPrincipal();
  40.       } catch (IllegalArgumentException var0) {
  41.          theSystemPrincipal = new Principal(12, "52:54:45:4e:4e:45:54:49");
  42.       }
  43.  
  44.       theSystemPrincipalAry = new Principal[1];
  45.       theSystemPrincipalAry[0] = theSystemPrincipal;
  46.       theSystemTarget = Target.findTarget("SuperUser", theSystemPrincipal);
  47.       theUnsignedPrincipal = new Principal(12, "4a:52:4f:53:4b:49:4e:44");
  48.       theUnsignedPrincipalAry = new Principal[1];
  49.       theUnsignedPrincipalAry[0] = theUnsignedPrincipal;
  50.       theUnknownPrincipal = new Principal(12, "52:4f:53:4b:49:4e:44:4a");
  51.       theUnknownPrincipalAry = new Principal[1];
  52.       theUnknownPrincipalAry[0] = theUnknownPrincipal;
  53.    }
  54.  
  55.    public PrivilegeManager() {
  56.       this.itsPrinToPrivTable.put(getSystemPrincipal(), new SystemPrivilegeTable());
  57.       this.itsPrinToMacroTargetPrivTable.put(getSystemPrincipal(), new SystemPrivilegeTable());
  58.       initClass();
  59.       this.load();
  60.       if (this.isJavaSecurityDefaultTo30Enabled()) {
  61.          Target var1 = Target.findTarget("30Capabilities", getSystemPrincipal());
  62.          Privilege var2 = Privilege.findPrivilege(1, 1);
  63.          this.registerPrincipalAndSetPrivileges(theUnsignedPrincipal, var1, var2);
  64.       }
  65.  
  66.    }
  67.  
  68.    private void registerPrincipal(Principal var1) {
  69.       Hashtable var2 = this.itsPrinToPrivTable;
  70.       synchronized(var2){}
  71.  
  72.       try {
  73.          if (this.itsPrinToPrivTable.get(var1) == null) {
  74.             this.itsPrinToPrivTable.put(var1, new PrivilegeTable());
  75.          }
  76.       } catch (Throwable var8) {
  77.          throw var8;
  78.       }
  79.  
  80.       var2 = this.itsPrinToMacroTargetPrivTable;
  81.       synchronized(var2){}
  82.  
  83.       try {
  84.          if (this.itsPrinToMacroTargetPrivTable.get(var1) == null) {
  85.             this.itsPrinToMacroTargetPrivTable.put(var1, new PrivilegeTable());
  86.          }
  87.       } catch (Throwable var7) {
  88.          throw var7;
  89.       }
  90.  
  91.    }
  92.  
  93.    private void unregisterPrincipal(Principal var1) {
  94.       if (getSystemPrincipal().equals(var1)) {
  95.          throw new ForbiddenTargetException("Can not delete system principal");
  96.       } else {
  97.          Hashtable var3 = this.itsPrinToPrivTable;
  98.          synchronized(var3){}
  99.  
  100.          try {
  101.             Object var2 = this.itsPrinToPrivTable.remove(var1);
  102.             if (var2 == null) {
  103.                throw new ForbiddenTargetException("Couldn't delete principal");
  104.             }
  105.          } catch (Throwable var9) {
  106.             throw var9;
  107.          }
  108.  
  109.          var3 = this.itsPrinToMacroTargetPrivTable;
  110.          synchronized(var3){}
  111.  
  112.          try {
  113.             Object var10 = this.itsPrinToMacroTargetPrivTable.remove(var1);
  114.             if (var10 == null) {
  115.                throw new ForbiddenTargetException("Couldn't delete principal");
  116.             }
  117.          } catch (Throwable var8) {
  118.             throw var8;
  119.          }
  120.  
  121.       }
  122.    }
  123.  
  124.    private native boolean checkPrivilegeEnabled(Target[] var1, int var2, Object var3, boolean var4);
  125.  
  126.    public void checkPrivilegeEnabled(Target var1) {
  127.       Target[] var2 = new Target[]{var1};
  128.       this.checkPrivilegeEnabled(var2, 1, (Object)null, true);
  129.    }
  130.  
  131.    public void checkPrivilegeEnabled(Target var1, Object var2) {
  132.       Target[] var3 = new Target[]{var1};
  133.       this.checkPrivilegeEnabled(var3, 1, var2, true);
  134.    }
  135.  
  136.    public static void checkPrivilegeEnabled(String var0) {
  137.       PrivilegeManager var1 = getPrivilegeManager();
  138.       if (var1 == null) {
  139.          throw new ForbiddenTargetException("access to target denied");
  140.       } else {
  141.          Target[] var2 = new Target[]{Target.findTarget(var0)};
  142.          if (var2[0] == null) {
  143.             throw new ForbiddenTargetException(var0 + " target not found");
  144.          } else {
  145.             var1.checkPrivilegeEnabled(var2, 1, (Object)null, true);
  146.          }
  147.       }
  148.    }
  149.  
  150.    boolean isPrivilegeEnabled(Target var1, int var2) {
  151.       Target[] var3 = new Target[]{var1};
  152.       return this.isPrivilegeEnabled(var3, var2 + 1, (Object)null);
  153.    }
  154.  
  155.    boolean isPrivilegeEnabled(Target[] var1, int var2, Object var3) {
  156.       int var4 = var1.length;
  157.  
  158.       while(var4-- > 0) {
  159.          if (var1[var4] == null) {
  160.             throw new ForbiddenTargetException("Null target is passed.");
  161.          }
  162.       }
  163.  
  164.       return this.checkPrivilegeEnabled(var1, var2 + 1, var3, false);
  165.    }
  166.  
  167.    public static void enablePrivilege(String var0) {
  168.       PrivilegeManager var1 = getPrivilegeManager();
  169.       if (var1 == null) {
  170.          throw new ForbiddenTargetException("access to target denied");
  171.       } else {
  172.          Target var2 = Target.findTarget(var0);
  173.          if (var2 == null) {
  174.             throw new ForbiddenTargetException(var0 + " target not found");
  175.          } else {
  176.             var1.enablePrincipalPrivilegeHelper(var2, 1, (Principal)null, (Object)null);
  177.             var1.enableScopePrivilegeHelper(var2, 1, (Object)null, false, (Principal)null);
  178.          }
  179.       }
  180.    }
  181.  
  182.    public void enablePrivilege(Target var1) {
  183.       this.enablePrincipalPrivilegeHelper(var1, 1, (Principal)null, (Object)null);
  184.       this.enableScopePrivilegeHelper(var1, 1, (Object)null, false, (Principal)null);
  185.    }
  186.  
  187.    public void enablePrivilege(Target var1, Principal var2) {
  188.       this.enablePrincipalPrivilegeHelper(var1, 1, var2, (Object)null);
  189.       this.enableScopePrivilegeHelper(var1, 1, (Object)null, false, var2);
  190.    }
  191.  
  192.    public void enablePrivilege(Target var1, Principal var2, Object var3) {
  193.       this.enablePrincipalPrivilegeHelper(var1, 1, var2, var3);
  194.       this.enableScopePrivilegeHelper(var1, 1, var3, false, var2);
  195.    }
  196.  
  197.    void enablePrivilege(String var1, int var2) {
  198.       Target var3 = Target.findTarget(var1);
  199.       if (var3 == null) {
  200.          throw new ForbiddenTargetException(var1 + " target not found");
  201.       } else {
  202.          this.enablePrincipalPrivilegeHelper(var3, var2 + 1, (Principal)null, (Object)null);
  203.          this.enableScopePrivilegeHelper(var3, var2 + 1, (Object)null, false, (Principal)null);
  204.       }
  205.    }
  206.  
  207.    Object setScopePrivilegeAssistant(int var1) {
  208.       return this.enableScopePrivilegeHelper(theSystemTarget, var1 + 1, (Object)null, true, (Principal)null);
  209.    }
  210.  
  211.    Object setScopePrivilegeAssistant(int var1, String var2) {
  212.       Target var3 = Target.findTarget(var2);
  213.       if (var3 == null) {
  214.          throw new ForbiddenTargetException(var2 + " target not found");
  215.       } else {
  216.          this.enablePrincipalPrivilegeHelper(var3, var1 + 1, (Principal)null, (Object)null);
  217.          return this.enableScopePrivilegeHelper(var3, var1 + 1, (Object)null, true, (Principal)null);
  218.       }
  219.    }
  220.  
  221.    private void enablePrincipalPrivilegeHelper(Target var1, int var2, Principal var3, Object var4) {
  222.       Principal var6 = null;
  223.       Principal[] var5 = this.getClassPrincipalsFromStackUnsafeJava(var2 + 1);
  224.       if (var3 != null) {
  225.          int var7 = var5.length;
  226.  
  227.          while(var7-- > 0) {
  228.             if (var5[var7].equals(var3) && (var5[var7].isCert() || var5[var7].isCertFingerprint())) {
  229.                var6 = var5[var7];
  230.                break;
  231.             }
  232.          }
  233.  
  234.          if (var6 == null) {
  235.             Target var8 = Target.findTarget("Impersonator");
  236.             this.checkPrivilegeEnabled(var8);
  237.             var6 = var3;
  238.             var5 = new Principal[]{var3};
  239.          }
  240.       }
  241.  
  242.       if (!this.isPermissionGranted(var1, var5, var4)) {
  243.          if (var6 == null) {
  244.             if (var5.length == 0) {
  245.                throw new ForbiddenTargetException("request's caller has no principal!");
  246.             }
  247.  
  248.             var6 = var5[0];
  249.          }
  250.  
  251.          Object var13 = UpdateLock;
  252.          synchronized(var13){}
  253.  
  254.          try {
  255.             if (!this.isPermissionGranted(var1, var5, var4)) {
  256.                Privilege var12 = var1.enablePrivilege(var6, var4);
  257.                if (!var12.isAllowed() && var12.getDuration() == 1) {
  258.                   throw new ForbiddenTargetException("User didn't grant the " + var1.getName() + " privilege.");
  259.                }
  260.  
  261.                this.registerPrincipalAndSetPrivileges(var6, var1, var12);
  262.                if (var6.savePrincipalPermanently() && var12.getDuration() == 2 && !var6.equals(theUnsignedPrincipal)) {
  263.                   this.save();
  264.                }
  265.  
  266.                if (!var12.isForbidden()) {
  267.                   return;
  268.                }
  269.  
  270.                throw new ForbiddenTargetException("User didn't grant the " + var1.getName() + " privilege.");
  271.             }
  272.          } catch (Throwable var11) {
  273.             throw var11;
  274.          }
  275.  
  276.       }
  277.    }
  278.  
  279.    private boolean isPermissionGranted(Target var1, Principal[] var2, Object var3) {
  280.       int var4 = this.getPrincipalPrivilege(var1, var2, var3);
  281.       switch (var4) {
  282.          case 0:
  283.          default:
  284.             throw new ForbiddenTargetException("access to target denied");
  285.          case 1:
  286.             return true;
  287.          case 2:
  288.             return false;
  289.       }
  290.    }
  291.  
  292.    private Object enableScopePrivilegeHelper(Target var1, int var2, Object var3, boolean var4, Principal var5) {
  293.       if (var5 != null) {
  294.          this.checkPrivilegeGranted(var1, var5, var3);
  295.       } else {
  296.          this.checkPrivilegeGranted(var1, var2 + 1, var3);
  297.       }
  298.  
  299.       PrivilegeTable var6 = this.getPrivilegeTableFromStackUnsafe(var2 + 1, !var4);
  300.       if (var4) {
  301.          if (var6 != null) {
  302.             var6 = (PrivilegeTable)var6.clone();
  303.          } else {
  304.             var6 = new PrivilegeTable();
  305.          }
  306.       }
  307.  
  308.       Privilege var7 = Privilege.findPrivilege(1, 0);
  309.       this.updatePrivilegeTable(var1, var6, var7);
  310.       return var6;
  311.    }
  312.  
  313.    private void registerPrincipalAndSetPrivileges(Principal var1, Target var2, Privilege var3) {
  314.       this.registerPrincipal(var1);
  315.       PrivilegeTable var4 = (PrivilegeTable)this.itsPrinToMacroTargetPrivTable.get(var1);
  316.       var4.put(var2, var3);
  317.       var4 = (PrivilegeTable)this.itsPrinToPrivTable.get(var1);
  318.       this.updatePrivilegeTable(var2, var4, var3);
  319.    }
  320.  
  321.    private void updatePrivilegeTable(Target var1, PrivilegeTable var2, Privilege var3) {
  322.       Target[] var4 = var1.getFlattenedTargetAryUnsafe();
  323.       synchronized(var2){}
  324.  
  325.       try {
  326.          for(int var8 = var4.length; var8-- > 0; var2.put(var4[var8], var3)) {
  327.             Privilege var5 = var2.get(var4[var8]);
  328.             if (var5 != null) {
  329.                var3 = Privilege.add(var5, var3);
  330.             }
  331.          }
  332.       } catch (Throwable var10) {
  333.          throw var10;
  334.       }
  335.  
  336.    }
  337.  
  338.    public void revertPrivilege(Target var1) {
  339.       this.revertPrivilege(var1, 1);
  340.    }
  341.  
  342.    public static void revertPrivilege(String var0) {
  343.       PrivilegeManager var1 = getPrivilegeManager();
  344.       if (var1 == null) {
  345.          throw new ForbiddenTargetException("access to target denied");
  346.       } else {
  347.          Target var2 = Target.findTarget(var0);
  348.          if (var2 == null) {
  349.             throw new ForbiddenTargetException(var0 + " target not found");
  350.          } else {
  351.             var1.revertPrivilege(var2, 1);
  352.          }
  353.       }
  354.    }
  355.  
  356.    void revertPrivilege() {
  357.       PrivilegeTable var1 = this.getPrivilegeTableFromStackUnsafe(1, true);
  358.       synchronized(var1){}
  359.  
  360.       try {
  361.          var1.clear();
  362.       } catch (Throwable var4) {
  363.          throw var4;
  364.       }
  365.  
  366.    }
  367.  
  368.    private void revertPrivilege(Target var1, int var2) {
  369.       PrivilegeTable var3 = this.getPrivilegeTableFromStackUnsafe(var2 + 1, true);
  370.       synchronized(var3){}
  371.  
  372.       try {
  373.          var3.put(var1, Privilege.findPrivilege(2, 0));
  374.       } catch (Throwable var6) {
  375.          throw var6;
  376.       }
  377.  
  378.    }
  379.  
  380.    public void disablePrivilege(Target var1) {
  381.       this.disablePrivilege(var1, 1);
  382.    }
  383.  
  384.    public static void disablePrivilege(String var0) {
  385.       PrivilegeManager var1 = getPrivilegeManager();
  386.       if (var1 == null) {
  387.          throw new ForbiddenTargetException("access to target denied");
  388.       } else {
  389.          Target var2 = Target.findTarget(var0);
  390.          if (var2 == null) {
  391.             throw new ForbiddenTargetException(var0 + " target not found");
  392.          } else {
  393.             var1.disablePrivilege(var2, 1);
  394.          }
  395.       }
  396.    }
  397.  
  398.    private void disablePrivilege(Target var1, int var2) {
  399.       PrivilegeTable var3 = this.getPrivilegeTableFromStackUnsafe(var2 + 1, true);
  400.       var3.put(var1, Privilege.findPrivilege(0, 0));
  401.    }
  402.  
  403.    private int getPrincipalPrivilege(Target var1, int var2) {
  404.       return this.getPrincipalPrivilege(var1, var2 + 1, (Object)null);
  405.    }
  406.  
  407.    private int getPrincipalPrivilege(Target var1, Principal[] var2) {
  408.       return this.getPrincipalPrivilege(var1, (Principal[])var2, (Object)null);
  409.    }
  410.  
  411.    private int getPrincipalPrivilege(Target var1, int var2, Object var3) {
  412.       Principal[] var4 = this.getClassPrincipalsFromStackUnsafeJava(var2 + 1);
  413.       return this.getPrincipalPrivilege(var1, var4, var3);
  414.    }
  415.  
  416.    private int getPrincipalPrivilege(Target var1, Principal[] var2, Object var3) {
  417.       boolean var5 = false;
  418.       int var6 = var2.length;
  419.  
  420.       while(var6-- > 0) {
  421.          Privilege var4 = this.getPrincipalPrivilege(var1, var2[var6], var3);
  422.          if (var4 != null) {
  423.             switch (var4.getPermission()) {
  424.                case 0:
  425.                default:
  426.                   return 0;
  427.                case 1:
  428.                   var5 = true;
  429.                case 2:
  430.             }
  431.          }
  432.       }
  433.  
  434.       if (var5) {
  435.          return 1;
  436.       } else {
  437.          return 2;
  438.       }
  439.    }
  440.  
  441.    Privilege getPrincipalPrivilege(Target var1, Principal var2, Object var3) {
  442.       PrivilegeTable var4 = (PrivilegeTable)this.itsPrinToPrivTable.get(var2);
  443.       if (var4 == null) {
  444.          return null;
  445.       } else {
  446.          Privilege var5;
  447.          if (var1 instanceof ParameterizedTarget) {
  448.             ParameterizedTarget var6 = (ParameterizedTarget)var1;
  449.             var5 = var6.getPrincipalPrivilege(var2, var3);
  450.          } else {
  451.             var5 = var4.get(var1);
  452.          }
  453.  
  454.          return var5;
  455.       }
  456.    }
  457.  
  458.    public static void checkPrivilegeGranted(String var0) {
  459.       PrivilegeManager var1 = getPrivilegeManager();
  460.       if (var1 == null) {
  461.          throw new ForbiddenTargetException("access to target denied");
  462.       } else {
  463.          Target var2 = Target.findTarget(var0);
  464.          if (var2 == null) {
  465.             throw new ForbiddenTargetException(var0 + " target not found");
  466.          } else {
  467.             var1.checkPrivilegeGranted(var2, 1, (Object)null);
  468.          }
  469.       }
  470.    }
  471.  
  472.    public void checkPrivilegeGranted(Target var1) {
  473.       this.checkPrivilegeGranted(var1, 1, (Object)null);
  474.    }
  475.  
  476.    private void checkPrivilegeGranted(Target var1, int var2) {
  477.       this.checkPrivilegeGranted(var1, var2 + 1, (Object)null);
  478.    }
  479.  
  480.    public void checkPrivilegeGranted(Target var1, Object var2) {
  481.       this.checkPrivilegeGranted(var1, 1, var2);
  482.    }
  483.  
  484.    private void checkPrivilegeGranted(Target var1, int var2, Object var3) {
  485.       int var4 = this.getPrincipalPrivilege(var1, var2 + 1, var3);
  486.       if (var4 != 1) {
  487.          throw new ForbiddenTargetException("access to target denied");
  488.       }
  489.    }
  490.  
  491.    public void checkPrivilegeGranted(Target var1, Principal var2, Object var3) {
  492.       Principal[] var4 = new Principal[]{var2};
  493.       int var5 = this.getPrincipalPrivilege(var1, var4, var3);
  494.       if (var5 != 1) {
  495.          throw new ForbiddenTargetException("access to target denied");
  496.       }
  497.    }
  498.  
  499.    public boolean isCalledByPrincipal(Principal var1, int var2) {
  500.       Principal[] var3 = this.getClassPrincipalsFromStackUnsafeJava(var2 + 1);
  501.       int var4 = var3.length;
  502.  
  503.       while(var4-- > 0) {
  504.          if (var3[var4].equals(var1)) {
  505.             return true;
  506.          }
  507.       }
  508.  
  509.       return false;
  510.    }
  511.  
  512.    public boolean isCalledByPrincipal(Principal var1) {
  513.       return this.isCalledByPrincipal(var1, 2);
  514.    }
  515.  
  516.    public static Principal getSystemPrincipal() {
  517.       if (theSystemPrincipal == null) {
  518.          init();
  519.       }
  520.  
  521.       return theSystemPrincipal;
  522.    }
  523.  
  524.    public static PrivilegeManager getPrivilegeManager() {
  525.       return AppletSecurity.getPrivilegeManager();
  526.    }
  527.  
  528.    private static Principal[] getSystemPrincipals() {
  529.       try {
  530.          return (Principal[])theSystemPrincipalAry.clone();
  531.       } catch (CloneNotSupportedException var0) {
  532.          throw new ForbiddenTargetException("internal error: unable to clone System Principal");
  533.       }
  534.    }
  535.  
  536.    private static Principal[] getSystemPrincipalsUnsafe() {
  537.       return theSystemPrincipalAry;
  538.    }
  539.  
  540.    private static Principal[] getUnsignedPrincipalArray() {
  541.       try {
  542.          return (Principal[])theUnsignedPrincipalAry.clone();
  543.       } catch (CloneNotSupportedException var0) {
  544.          throw new ForbiddenTargetException("internal error: unable to clone Unsigned Principal");
  545.       }
  546.    }
  547.  
  548.    private static Principal[] getUnsignedPrincipalsUnsafe() {
  549.       return theUnsignedPrincipalAry;
  550.    }
  551.  
  552.    static Principal getUnsignedPrincipal() {
  553.       return theUnsignedPrincipal;
  554.    }
  555.  
  556.    private static Principal[] getUnknownPrincipalArrayUnsafe() {
  557.       return theUnknownPrincipalAry;
  558.    }
  559.  
  560.    static Principal[] getUnknownPrincipalArray() {
  561.       try {
  562.          return (Principal[])theUnknownPrincipalAry.clone();
  563.       } catch (CloneNotSupportedException var0) {
  564.          throw new ForbiddenTargetException("internal error: unable to clone Unknown Principal");
  565.       }
  566.    }
  567.  
  568.    static Principal getUnknownPrincipal() {
  569.       return theUnknownPrincipal;
  570.    }
  571.  
  572.    public static Principal[] getMyPrincipals() {
  573.       PrivilegeManager var0 = getPrivilegeManager();
  574.       return var0 == null ? null : var0.getClassPrincipalsFromStack(1);
  575.    }
  576.  
  577.    public Principal[] getClassPrincipals(Class var1) {
  578.       Principal[] var2 = this.getClassPrincipalsUnsafeJava(var1);
  579.  
  580.       try {
  581.          return (Principal[])var2.clone();
  582.       } catch (CloneNotSupportedException var3) {
  583.          throw new ForbiddenTargetException("internal error: unable to clone Principal");
  584.       }
  585.    }
  586.  
  587.    public boolean hasPrincipal(Class var1, Principal var2) {
  588.       Principal[] var3 = this.getClassPrincipalsUnsafeJava(var1);
  589.       int var4 = var3.length;
  590.  
  591.       while(var4-- > 0) {
  592.          if (var3[var4].equals(var2)) {
  593.             return true;
  594.          }
  595.       }
  596.  
  597.       return false;
  598.    }
  599.  
  600.    public int comparePrincipalArray(Principal[] var1, Principal[] var2) {
  601.       Hashtable var3 = new Hashtable();
  602.       Integer var4 = new Integer(1);
  603.       Integer var5 = new Integer(0);
  604.       int var8 = var2.length;
  605.  
  606.       while(var8-- > 0) {
  607.          var3.put(var2[var8], var4);
  608.       }
  609.  
  610.       int var9 = var1.length;
  611.  
  612.       while(var9-- > 0) {
  613.          Principal var7 = var1[var9];
  614.          Integer var6 = (Integer)var3.get(var7);
  615.          if (var6 == null) {
  616.             return 1;
  617.          }
  618.  
  619.          if (var6 == var4) {
  620.             var3.put(var7, var5);
  621.          }
  622.       }
  623.  
  624.       Enumeration var10 = var3.keys();
  625.  
  626.       while(var10.hasMoreElements()) {
  627.          Object var12 = var10.nextElement();
  628.          Integer var11 = (Integer)var3.get(var12);
  629.          if (var11 == var4) {
  630.             return -1;
  631.          }
  632.       }
  633.  
  634.       return 0;
  635.    }
  636.  
  637.    public Principal[] intersectPrincipalArray(Principal[] var1, Principal[] var2) {
  638.       boolean[] var3 = new boolean[var1.length];
  639.       int var4 = 0;
  640.  
  641.       for(int var5 = 0; var5 < var1.length; ++var5) {
  642.          for(int var6 = 0; var6 < var2.length; ++var6) {
  643.             if (var1[var5].equals(var2[var6])) {
  644.                var3[var5] = true;
  645.                ++var4;
  646.                break;
  647.             }
  648.          }
  649.       }
  650.  
  651.       Principal[] var9 = new Principal[var4];
  652.       int var7 = 0;
  653.  
  654.       for(int var8 = 0; var8 < var3.length; ++var8) {
  655.          if (var3[var8]) {
  656.             var9[var7++] = var1[var8];
  657.          }
  658.       }
  659.  
  660.       return var9;
  661.    }
  662.  
  663.    public boolean canExtendTrust(Principal[] var1, Principal[] var2) {
  664.       Principal[] var3 = this.intersectPrincipalArray(var1, var2);
  665.       if (var3.length == var1.length) {
  666.          return true;
  667.       } else if (var3.length != 0 && var3.length == var1.length - 1) {
  668.          for(int var4 = 0; var4 < var3.length; ++var4) {
  669.             if (var3[var4].isCodebase()) {
  670.                return false;
  671.             }
  672.          }
  673.  
  674.          int var5 = 0;
  675.  
  676.          for(int var6 = 0; var6 < var1.length; ++var6) {
  677.             if (var1[var6].isCodebase()) {
  678.                ++var5;
  679.             }
  680.          }
  681.  
  682.          if (var5 != 1) {
  683.             return false;
  684.          } else {
  685.             return true;
  686.          }
  687.       } else {
  688.          return false;
  689.       }
  690.    }
  691.  
  692.    public boolean checkMatchPrincipal(Class var1, int var2) {
  693.       return this.comparePrincipalArray(this.getClassPrincipalsFromStack(var2 + 1), this.getClassPrincipalsUnsafeJava(var1)) != 1;
  694.    }
  695.  
  696.    public boolean checkMatchPrincipal(Principal var1, int var2) {
  697.       Principal[] var3 = new Principal[]{var1};
  698.       return this.comparePrincipalArray(var3, this.getClassPrincipalsFromStack(var2 + 1)) != 1;
  699.    }
  700.  
  701.    public boolean checkMatchPrincipal(Class var1) {
  702.       return this.checkMatchPrincipal((Class)var1, 1);
  703.    }
  704.  
  705.    public boolean checkMatchPrincipalAlways() {
  706.       return SecurityManager.checksMatchPrincipalAlways(1);
  707.    }
  708.  
  709.    public Principal[] getClassPrincipalsFromStack(int var1) {
  710.       Principal[] var2 = this.getClassPrincipalsFromStackUnsafeJava(var1 + 1);
  711.  
  712.       try {
  713.          return (Principal[])var2.clone();
  714.       } catch (CloneNotSupportedException var3) {
  715.          throw new ForbiddenTargetException("internal error: unable to clone Principal");
  716.       }
  717.    }
  718.  
  719.    private Principal[] getClassPrincipalsFromStackUnsafeJava(int var1) {
  720.       Principal[] var2 = this.getClassPrincipalsFromStackUnsafe(var1 + 1);
  721.       if (var2 == null) {
  722.          if (!this.getJavaSecurityEnabled()) {
  723.             System.out.println("Java Navigator Beta internal error message: Defaulting to system principal");
  724.             return getSystemPrincipalsUnsafe();
  725.          } else {
  726.             return getUnknownPrincipalArray();
  727.          }
  728.       } else {
  729.          return var2;
  730.       }
  731.    }
  732.  
  733.    private Principal[] getClassPrincipalsUnsafeJava(Class var1) {
  734.       Principal[] var2 = this.getClassPrincipalsUnsafe(var1);
  735.       if (var2 == null) {
  736.          if (!this.getJavaSecurityEnabled()) {
  737.             System.out.println("Java Navigator Beta internal error message: Defaulting to system principal");
  738.             return getSystemPrincipalsUnsafe();
  739.          } else {
  740.             return getUnknownPrincipalArray();
  741.          }
  742.       } else {
  743.          return var2;
  744.       }
  745.    }
  746.  
  747.    PrivilegeTable getPrivilegeTableFromStack(int var1) {
  748.       PrivilegeTable var2 = this.getPrivilegeTableFromStackUnsafe(var1 + 1, false);
  749.       return var2 == null ? null : (PrivilegeTable)var2.clone();
  750.    }
  751.  
  752.    public PrivilegeTable getPrivilegeTableFromStack() {
  753.       return this.getPrivilegeTableFromStack(2);
  754.    }
  755.  
  756.    private native Principal[] getClassPrincipalsFromStackUnsafe(int var1);
  757.  
  758.    private native Principal[] getClassPrincipalsUnsafe(Class var1);
  759.  
  760.    private native PrivilegeTable getPrivilegeTableFromStackUnsafe(int var1, boolean var2);
  761.  
  762.    native boolean getJavaSecurityEnabled();
  763.  
  764.    synchronized native int getPrivilegeFromUser(String var1, String var2, String var3, boolean var4);
  765.  
  766.    native boolean showDocument(String var1, String var2);
  767.  
  768.    native boolean isJavaSecurityDefaultTo30Enabled();
  769.  
  770.    native boolean getBoolPref(String var1);
  771.  
  772.    private native String getWHFileName(String var1, int var2);
  773.  
  774.    native boolean picsCanUserEnableAdditionalJavaCapabilities();
  775.  
  776.    Principal[] getAllPrincipals() {
  777.       int var1 = 0;
  778.       Hashtable var6 = this.itsPrinToMacroTargetPrivTable;
  779.       synchronized(var6){}
  780.  
  781.       Object var5;
  782.       try {
  783.          int var8 = this.itsPrinToMacroTargetPrivTable.size();
  784.          if (var8 != 0) {
  785.             Principal[] var2 = new Principal[var8];
  786.  
  787.             Principal var4;
  788.             for(Enumeration var3 = this.itsPrinToMacroTargetPrivTable.keys(); var3.hasMoreElements(); var2[var1++] = var4) {
  789.                var4 = (Principal)var3.nextElement();
  790.             }
  791.  
  792.             return var2;
  793.          }
  794.  
  795.          var5 = null;
  796.       } catch (Throwable var10) {
  797.          throw var10;
  798.       }
  799.  
  800.       return (Principal[])var5;
  801.    }
  802.  
  803.    static String getAllPrincipalsString() {
  804.       PrivilegeManager var0 = getPrivilegeManager();
  805.       if (var0 == null) {
  806.          return null;
  807.       } else {
  808.          Principal[] var1 = var0.getAllPrincipals();
  809.          if (var1 == null) {
  810.             return null;
  811.          } else {
  812.             boolean var2 = true;
  813.             StringBuffer var3 = new StringBuffer();
  814.             int var4 = var1.length;
  815.  
  816.             while(var4-- > 0) {
  817.                if (var0.principalHasPrivileges(var1[var4])) {
  818.                   if (var2) {
  819.                      var3.append("\"" + var1[var4].toString() + "\"");
  820.                      var2 = false;
  821.                   } else {
  822.                      var3.append(",\"" + var1[var4].toString() + "\"");
  823.                   }
  824.                }
  825.             }
  826.  
  827.             if (var2) {
  828.                return null;
  829.             } else {
  830.                return var3.toString();
  831.             }
  832.          }
  833.       }
  834.    }
  835.  
  836.    private Principal getPrincipalFromString(String var1) {
  837.       Principal[] var2 = this.getAllPrincipals();
  838.       if (var2 == null) {
  839.          return null;
  840.       } else {
  841.          int var3 = var2.length;
  842.  
  843.          while(var3-- > 0) {
  844.             if (var1.equals(var2[var3].toString())) {
  845.                return var2[var3];
  846.             }
  847.          }
  848.  
  849.          return null;
  850.       }
  851.    }
  852.  
  853.    boolean principalHasPrivileges(Principal var1) {
  854.       Hashtable var3 = this.itsPrinToMacroTargetPrivTable;
  855.       synchronized(var3){}
  856.  
  857.       PrivilegeTable var2;
  858.       try {
  859.          var2 = (PrivilegeTable)this.itsPrinToMacroTargetPrivTable.get(var1);
  860.       } catch (Throwable var5) {
  861.          throw var5;
  862.       }
  863.  
  864.       return var2 != null && var2.size() != 0;
  865.    }
  866.  
  867.    static String[] getTargetsWithPrivileges(String var0) {
  868.       PrivilegeManager var1 = getPrivilegeManager();
  869.       if (var1 == null) {
  870.          return null;
  871.       } else {
  872.          Principal var2 = var1.getPrincipalFromString(var0);
  873.          if (var2 == null) {
  874.             return null;
  875.          } else {
  876.             StringBuffer var8 = new StringBuffer();
  877.             StringBuffer var9 = new StringBuffer();
  878.             StringBuffer var10 = new StringBuffer();
  879.             String[] var11 = new String[3];
  880.             Hashtable var12 = var1.itsPrinToMacroTargetPrivTable;
  881.             synchronized(var12){}
  882.  
  883.             PrivilegeTable var3;
  884.             try {
  885.                var3 = (PrivilegeTable)var1.itsPrinToMacroTargetPrivTable.get(var2);
  886.             } catch (Throwable var14) {
  887.                throw var14;
  888.             }
  889.  
  890.             Enumeration var6 = var3.keys();
  891.  
  892.             while(var6.hasMoreElements()) {
  893.                Target var4 = (Target)var6.nextElement();
  894.                Privilege var5 = var3.get(var4);
  895.                String var7 = var4.getDescription();
  896.                if (var5.isAllowed()) {
  897.                   if (var5.getDuration() == 2) {
  898.                      var8.append("<option>" + var7);
  899.                   } else {
  900.                      var9.append("<option>" + var7);
  901.                   }
  902.                } else if (var5.isForbidden()) {
  903.                   var10.append("<option>" + var7);
  904.                }
  905.             }
  906.  
  907.             var11[0] = var8.toString();
  908.             var11[1] = var9.toString();
  909.             var11[2] = var10.toString();
  910.             return var11;
  911.          }
  912.       }
  913.    }
  914.  
  915.    private Target getTargetFromString(Principal var1, String var2) {
  916.       PrivilegeTable var3 = (PrivilegeTable)this.itsPrinToMacroTargetPrivTable.get(var1);
  917.       Enumeration var5 = var3.keys();
  918.  
  919.       while(var5.hasMoreElements()) {
  920.          Target var4 = (Target)var5.nextElement();
  921.          if (var2.equals(var4.getDescription())) {
  922.             return var4;
  923.          }
  924.       }
  925.  
  926.       return null;
  927.    }
  928.  
  929.    static String[] getTargetDetails(String var0) {
  930.       PrivilegeManager var1 = getPrivilegeManager();
  931.       if (var1 == null) {
  932.          return null;
  933.       } else {
  934.          Target var2 = Target.getTargetFromDescription(var0);
  935.          if (var2 == null) {
  936.             return null;
  937.          } else {
  938.             StringBuffer var3 = new StringBuffer();
  939.             Target[] var4 = var2.getFlattenedTargetAryUnsafe();
  940.             int var5 = var4.length;
  941.  
  942.             while(var5-- > 0) {
  943.                var3.append("<option>" + var4[var5].getDescription() + " (" + var4[var5].getRisk() + ")");
  944.             }
  945.  
  946.             String[] var6 = new String[]{var3.toString(), var2.getRisk()};
  947.             return var6;
  948.          }
  949.       }
  950.    }
  951.  
  952.    static boolean removePrincipal(String var0) {
  953.       PrivilegeManager var1 = getPrivilegeManager();
  954.       if (var1 == null) {
  955.          return false;
  956.       } else {
  957.          Principal var2 = var1.getPrincipalFromString(var0);
  958.          if (var2 == null) {
  959.             return false;
  960.          } else {
  961.             try {
  962.                var1.removeAllParameterizedTargets(var2);
  963.                var1.unregisterPrincipal(var2);
  964.             } catch (Exception var4) {
  965.                System.out.println("Unable to delete principal " + var2 + " " + var4);
  966.                ((Throwable)var4).printStackTrace(System.out);
  967.                return false;
  968.             }
  969.  
  970.             var1.save();
  971.             return true;
  972.          }
  973.       }
  974.    }
  975.  
  976.    static boolean removePrincipalsPrivilege(String var0, String var1) {
  977.       PrivilegeManager var2 = getPrivilegeManager();
  978.       if (var2 == null) {
  979.          return false;
  980.       } else {
  981.          Principal var3 = var2.getPrincipalFromString(var0);
  982.          if (var3 == null) {
  983.             return false;
  984.          } else {
  985.             Target var4 = var2.getTargetFromString(var3, var1);
  986.             if (var4 == null) {
  987.                return false;
  988.             } else {
  989.                Hashtable var9 = var2.itsPrinToMacroTargetPrivTable;
  990.                synchronized(var9){}
  991.  
  992.                PrivilegeTable var6;
  993.                try {
  994.                   var6 = (PrivilegeTable)var2.itsPrinToMacroTargetPrivTable.get(var3);
  995.                   if (var4 instanceof ParameterizedTarget) {
  996.                      ParameterizedTarget var11 = (ParameterizedTarget)var4;
  997.                      var11.unregisterPrincipal(var3);
  998.                   }
  999.  
  1000.                   var6.remove(var4);
  1001.                } catch (Throwable var17) {
  1002.                   throw var17;
  1003.                }
  1004.  
  1005.                var9 = var2.itsPrinToPrivTable;
  1006.                synchronized(var9){}
  1007.  
  1008.                try {
  1009.                   PrivilegeTable var19 = new PrivilegeTable();
  1010.                   var2.itsPrinToPrivTable.put(var3, var19);
  1011.                   Enumeration var5 = var6.keys();
  1012.  
  1013.                   while(var5.hasMoreElements()) {
  1014.                      Target var8 = (Target)var5.nextElement();
  1015.                      Privilege var7 = var6.get(var8);
  1016.                      var2.updatePrivilegeTable(var8, var19, var7);
  1017.                   }
  1018.                } catch (Throwable var16) {
  1019.                   throw var16;
  1020.                }
  1021.  
  1022.                var2.save();
  1023.                return true;
  1024.             }
  1025.          }
  1026.       }
  1027.    }
  1028.  
  1029.    void removeAllParameterizedTargets(Principal var1) {
  1030.       Hashtable var5 = this.itsPrinToPrivTable;
  1031.       synchronized(var5){}
  1032.  
  1033.       try {
  1034.          PrivilegeTable var3 = (PrivilegeTable)this.itsPrinToPrivTable.get(var1);
  1035.          Enumeration var2 = var3.keys();
  1036.  
  1037.          while(var2.hasMoreElements()) {
  1038.             Target var4 = (Target)var2.nextElement();
  1039.             if (var4 instanceof ParameterizedTarget) {
  1040.                ParameterizedTarget var7 = (ParameterizedTarget)var4;
  1041.                var7.unregisterPrincipal(var1);
  1042.             }
  1043.          }
  1044.       } catch (Throwable var9) {
  1045.          throw var9;
  1046.       }
  1047.  
  1048.    }
  1049.  
  1050.    String getArchiveFileName() {
  1051.       if (SignedAppletDBName == null) {
  1052.          SignedAppletDBName = this.getWHFileName("", 1);
  1053.       }
  1054.  
  1055.       return SignedAppletDBName;
  1056.    }
  1057.  
  1058.    String getArchiveFileName(String var1) {
  1059.       return this.getWHFileName(var1, 1);
  1060.    }
  1061.  
  1062.    private synchronized void save() {
  1063.       SecurityManager.enablePrivilege("UniversalFileWrite");
  1064.       String var2 = this.getArchiveFileName();
  1065.  
  1066.       FileOutputStream var1;
  1067.       try {
  1068.          var1 = new FileOutputStream(var2);
  1069.       } catch (FileNotFoundException var6) {
  1070.          System.err.println("Error1: can't open <" + var2 + "> to save java capabilities list");
  1071.          return;
  1072.       } catch (IOException var7) {
  1073.          System.err.println("Error2: can't open <" + var2 + "> to save java capabilities list");
  1074.          return;
  1075.       }
  1076.  
  1077.       try {
  1078.          this.save(var1);
  1079.       } catch (Exception var5) {
  1080.          System.err.println("Error: unable to save java capabilities list into <" + var2 + "> " + var5);
  1081.       }
  1082.  
  1083.       try {
  1084.          var1.close();
  1085.       } catch (IOException var4) {
  1086.          System.err.println("Error while saving java capabilities list into <" + var2 + ">");
  1087.       }
  1088.    }
  1089.  
  1090.    private void save(OutputStream var1) {
  1091.       Hashtable var10 = new Hashtable();
  1092.       Enumeration var4 = this.itsPrinToMacroTargetPrivTable.keys();
  1093.  
  1094.       while(var4.hasMoreElements()) {
  1095.          Principal var7 = (Principal)var4.nextElement();
  1096.          PrivilegeTable var6 = (PrivilegeTable)this.itsPrinToMacroTargetPrivTable.get(var7);
  1097.          synchronized(var6){}
  1098.  
  1099.          try {
  1100.             PrivilegeTable var11 = new PrivilegeTable();
  1101.             Enumeration var5 = var6.keys();
  1102.  
  1103.             while(var5.hasMoreElements()) {
  1104.                Target var9 = (Target)var5.nextElement();
  1105.                Privilege var8 = var6.get(var9);
  1106.                switch (var8.getDuration()) {
  1107.                   case 2:
  1108.                      var11.put(var9, var8);
  1109.                }
  1110.             }
  1111.  
  1112.             if (var11.size() > 0) {
  1113.                var10.put(var7, var11);
  1114.             }
  1115.          } catch (Throwable var18) {
  1116.             throw var18;
  1117.          }
  1118.       }
  1119.  
  1120.       Archive var2 = new Archive();
  1121.       Archiver var3 = new Archiver(var2);
  1122.  
  1123.       try {
  1124.          var3.archiveRootObject(var10);
  1125.       } catch (CodingException var17) {
  1126.          System.err.println("Internal error during archiving of Capabilities");
  1127.          ((Throwable)var17).printStackTrace(System.out);
  1128.          return;
  1129.       }
  1130.  
  1131.       try {
  1132.          var2.write(var1);
  1133.       } catch (Exception var16) {
  1134.          System.err.println("Error during serializing java Capabilities " + var16);
  1135.       }
  1136.    }
  1137.  
  1138.    boolean isSecurityInited() {
  1139.       return theSecurityInited;
  1140.    }
  1141.  
  1142.    private synchronized void load() {
  1143.       if (!theSecurityInited) {
  1144.          Object var1 = null;
  1145.          String var2 = this.getArchiveFileName();
  1146.          SecurityManager.enablePrivilege("UniversalFileRead");
  1147.  
  1148.          try {
  1149.             var6 = new FileInputStream(var2);
  1150.          } catch (Exception var5) {
  1151.             var6 = null;
  1152.          }
  1153.  
  1154.          if (var6 == null) {
  1155.             var2 = this.getArchiveFileName("0");
  1156.  
  1157.             try {
  1158.                var6 = new FileInputStream(var2);
  1159.             } catch (Exception var4) {
  1160.                return;
  1161.             }
  1162.          }
  1163.  
  1164.          this.load(var6);
  1165.  
  1166.          try {
  1167.             var6.close();
  1168.          } catch (IOException var3) {
  1169.             System.err.println("Error while reading java Capabilities file <" + var2 + ">");
  1170.             return;
  1171.          }
  1172.  
  1173.          theSecurityInited = true;
  1174.       }
  1175.    }
  1176.  
  1177.    private void load(InputStream var1) {
  1178.       Object var5 = null;
  1179.       Archive var2 = new Archive();
  1180.  
  1181.       try {
  1182.          var2.read(var1);
  1183.       } catch (Exception var17) {
  1184.          System.err.println("Error: unable to read java Capabilities from archive " + var17);
  1185.          return;
  1186.       }
  1187.  
  1188.       int[] var18 = var2.rootIdentifiers();
  1189.       Unarchiver var3 = new Unarchiver(var2);
  1190.  
  1191.       Object var4;
  1192.       try {
  1193.          var4 = var3.unarchiveIdentifier(var18[0]);
  1194.       } catch (Exception var16) {
  1195.          System.err.println("Error: old java capabilites list was lost " + var16);
  1196.          return;
  1197.       }
  1198.  
  1199.       if (var4 != null) {
  1200.          Hashtable var12 = (Hashtable)var4;
  1201.          Enumeration var6 = var12.keys();
  1202.  
  1203.          while(var6.hasMoreElements()) {
  1204.             Principal var14 = (Principal)var6.nextElement();
  1205.             PrivilegeTable var13 = (PrivilegeTable)var12.get(var14);
  1206.             this.registerPrincipal(var14);
  1207.             PrivilegeTable var8 = (PrivilegeTable)this.itsPrinToMacroTargetPrivTable.get(var14);
  1208.             Enumeration var7 = var13.keys();
  1209.  
  1210.             while(var7.hasMoreElements()) {
  1211.                Target var10 = (Target)var7.nextElement();
  1212.                Privilege var9 = var13.get(var10);
  1213.                Target var11 = Target.findTarget(var10);
  1214.                if (var11 == null) {
  1215.                   var11 = var10.registerTarget();
  1216.                }
  1217.  
  1218.                var9 = Privilege.findPrivilege(var9.getPermission(), var9.getDuration());
  1219.                var8.put(var11, var9);
  1220.             }
  1221.          }
  1222.  
  1223.          this.explodePrivilege();
  1224.       }
  1225.    }
  1226.  
  1227.    private void explodePrivilege() {
  1228.       Enumeration var1 = this.itsPrinToMacroTargetPrivTable.keys();
  1229.  
  1230.       while(var1.hasMoreElements()) {
  1231.          Principal var4 = (Principal)var1.nextElement();
  1232.          PrivilegeTable var3 = (PrivilegeTable)this.itsPrinToMacroTargetPrivTable.get(var4);
  1233.          PrivilegeTable var7 = (PrivilegeTable)this.itsPrinToPrivTable.get(var4);
  1234.          Enumeration var2 = var3.keys();
  1235.  
  1236.          while(var2.hasMoreElements()) {
  1237.             Target var6 = (Target)var2.nextElement();
  1238.             Privilege var5 = var3.get(var6);
  1239.             this.updatePrivilegeTable(var6, var7, var5);
  1240.          }
  1241.       }
  1242.  
  1243.    }
  1244. }
  1245.