home *** CD-ROM | disk | FTP | other *** search
- package java.security;
-
- import java.util.Vector;
- import sun.security.util.Debug;
-
- public final class AccessControlContext {
- private ProtectionDomain[] context;
- private boolean isPrivileged;
- private AccessControlContext privilegedContext;
- private DomainCombiner combiner;
- private static boolean debugInit = false;
- private static Debug debug = null;
-
- static Debug getDebug() {
- if (debugInit) {
- return debug;
- } else {
- if (Policy.isSet()) {
- debug = Debug.getInstance("access");
- debugInit = true;
- }
-
- return debug;
- }
- }
-
- public AccessControlContext(ProtectionDomain[] var1) {
- if (var1.length == 1) {
- this.context = (ProtectionDomain[])var1.clone();
- } else {
- Vector var2 = new Vector(var1.length);
-
- for(int var3 = 0; var3 < var1.length; ++var3) {
- if (var1[var3] != null && !var2.contains(var1[var3])) {
- var2.addElement(var1[var3]);
- }
- }
-
- this.context = new ProtectionDomain[var2.size()];
- var2.copyInto(this.context);
- }
-
- }
-
- public AccessControlContext(AccessControlContext var1, DomainCombiner var2) {
- SecurityManager var3 = System.getSecurityManager();
- if (var3 != null) {
- var3.checkPermission(new SecurityPermission("createAccessControlContext"));
- }
-
- if (var1 != null && var2 != null) {
- this.context = var1.context;
- this.combiner = var2;
- } else {
- throw new NullPointerException("null AccessControlContext or DomainCombiner was provided");
- }
- }
-
- private AccessControlContext(ProtectionDomain[] var1, DomainCombiner var2) {
- this.context = (ProtectionDomain[])var1.clone();
- this.combiner = var2;
- }
-
- AccessControlContext(ProtectionDomain[] var1, boolean var2) {
- this.context = var1;
- this.isPrivileged = var2;
- }
-
- boolean isPrivileged() {
- return this.isPrivileged;
- }
-
- public DomainCombiner getDomainCombiner() {
- SecurityManager var1 = System.getSecurityManager();
- if (var1 != null) {
- var1.checkPermission(new SecurityPermission("getDomainCombiner"));
- }
-
- return this.combiner;
- }
-
- public void checkPermission(Permission var1) throws AccessControlException {
- if (var1 == null) {
- throw new NullPointerException("permission can't be null");
- } else {
- if (getDebug() != null) {
- if (Debug.isOn("stack")) {
- Thread.currentThread();
- Thread.dumpStack();
- }
-
- if (Debug.isOn("domain")) {
- if (this.context == null) {
- debug.println("domain (context is null)");
- } else {
- for(int var2 = 0; var2 < this.context.length; ++var2) {
- debug.println("domain " + var2 + " " + this.context[var2]);
- }
- }
- }
- }
-
- if (this.context != null) {
- for(int var5 = 0; var5 < this.context.length; ++var5) {
- if (this.context[var5] != null && !this.context[var5].implies(var1)) {
- if (debug != null) {
- debug.println("access denied " + var1);
- if (Debug.isOn("failure")) {
- Thread.currentThread();
- Thread.dumpStack();
- ProtectionDomain var3 = this.context[var5];
- Debug var4 = debug;
- AccessController.doPrivileged(new 1(this, var4, var3));
- }
- }
-
- throw new AccessControlException("access denied " + var1, var1);
- }
- }
-
- if (debug != null) {
- debug.println("access allowed " + var1);
- }
-
- }
- }
- }
-
- AccessControlContext combineWithPrivilegedContext() {
- boolean var1 = this.context == null;
- AccessControlContext var2 = this.privilegedContext;
- boolean var3 = var2.context == null;
- if (var3 && var1 && var2.combiner == null) {
- return this;
- } else if (var2.combiner != null) {
- return this.goCombiner(this.context, var2, true);
- } else {
- int var4 = var1 ? 0 : this.context.length;
- if (var3 && var4 <= 2) {
- return this;
- } else {
- int var5 = var3 ? 0 : var2.context.length;
- if (var1 && var5 <= 2) {
- return var2;
- } else if (var4 == 1 && var5 == 1 && this.context[0] == var2.context[0]) {
- return this;
- } else {
- ProtectionDomain[] var6 = new ProtectionDomain[var4 + var5];
- int var9 = 0;
- if (!var1) {
- for(int var7 = 0; var7 < this.context.length; ++var7) {
- boolean var10 = true;
-
- for(int var8 = 0; var8 < var9 && var10; ++var8) {
- var10 = this.context[var7] != null && this.context[var7] != var6[var8];
- }
-
- if (var10) {
- var6[var9++] = this.context[var7];
- }
- }
- }
-
- if (!var3) {
- for(int var11 = 0; var11 < var2.context.length; ++var11) {
- boolean var13 = true;
-
- for(int var12 = 0; var12 < var9 && var13; ++var12) {
- var13 = var2.context[var11] != null && var2.context[var11] != var6[var12];
- }
-
- if (var13) {
- var6[var9++] = var2.context[var11];
- }
- }
- }
-
- if (var9 != var6.length) {
- if (var9 == 0) {
- var6 = null;
- } else {
- ProtectionDomain[] var14 = new ProtectionDomain[var9];
- System.arraycopy(var6, 0, var14, 0, var9);
- var6 = var14;
- }
- }
-
- return new AccessControlContext(var6, true);
- }
- }
- }
- }
-
- AccessControlContext optimize() {
- boolean var1 = this.context == null;
- boolean var2;
- AccessControlContext var3;
- if (this.isPrivileged) {
- if (this.privilegedContext != null) {
- return this.combineWithPrivilegedContext();
- }
-
- var2 = true;
- var3 = null;
- } else {
- var3 = AccessController.getInheritedAccessControlContext();
- var2 = var3 == null || var3.context == null && var3.combiner == null;
- }
-
- if (var2 && var1) {
- return this;
- } else if (var3 != null && var3.combiner != null) {
- return this.goCombiner(this.context, var3, false);
- } else {
- int var4 = var1 ? 0 : this.context.length;
- if (var2 && var4 <= 2) {
- return this;
- } else {
- int var5 = var2 ? 0 : var3.context.length;
- if (var1 && var5 <= 2) {
- return var3;
- } else if (var4 == 1 && var5 == 1 && this.context[0] == var3.context[0]) {
- return this;
- } else {
- ProtectionDomain[] var6 = new ProtectionDomain[var4 + var5];
- int var9 = 0;
- if (!var1) {
- for(int var7 = 0; var7 < this.context.length; ++var7) {
- boolean var10 = true;
-
- for(int var8 = 0; var8 < var9 && var10; ++var8) {
- var10 = this.context[var7] != null && this.context[var7] != var6[var8];
- }
-
- if (var10) {
- var6[var9++] = this.context[var7];
- }
- }
- }
-
- if (!var2) {
- for(int var11 = 0; var11 < var3.context.length; ++var11) {
- boolean var13 = true;
-
- for(int var12 = 0; var12 < var9 && var13; ++var12) {
- var13 = var3.context[var11] != null && var3.context[var11] != var6[var12];
- }
-
- if (var13) {
- var6[var9++] = var3.context[var11];
- }
- }
- }
-
- if (var9 != var6.length) {
- if (var9 == 0) {
- var6 = null;
- } else {
- ProtectionDomain[] var14 = new ProtectionDomain[var9];
- System.arraycopy(var6, 0, var14, 0, var9);
- var6 = var14;
- }
- }
-
- return new AccessControlContext(var6, this.isPrivileged);
- }
- }
- }
- }
-
- private AccessControlContext goCombiner(ProtectionDomain[] var1, AccessControlContext var2, boolean var3) {
- if (getDebug() != null) {
- debug.println("AccessControlContext invoking the Combiner");
- }
-
- ProtectionDomain[] var4 = var2.combiner.combine(var1 == null ? null : (ProtectionDomain[])var1.clone(), var2.context == null ? null : (ProtectionDomain[])var2.context.clone());
- return new AccessControlContext(var4, var2.combiner);
- }
-
- public boolean equals(Object var1) {
- if (var1 == this) {
- return true;
- } else if (!(var1 instanceof AccessControlContext)) {
- return false;
- } else {
- AccessControlContext var2 = (AccessControlContext)var1;
- if (this.context == null) {
- return var2.context == null;
- } else if (var2.context == null) {
- return false;
- } else if (this.containsAllPDs(var2) && var2.containsAllPDs(this)) {
- if (this.combiner == null) {
- return var2.combiner == null;
- } else if (var2.combiner == null) {
- return false;
- } else {
- return this.combiner.equals(var2.combiner);
- }
- } else {
- return false;
- }
- }
- }
-
- private boolean containsAllPDs(AccessControlContext var1) {
- boolean var2 = false;
-
- for(int var3 = 0; var3 < this.context.length; ++var3) {
- var2 = false;
- if (this.context[var3] == null) {
- for(int var5 = 0; var5 < var1.context.length && !var2; ++var5) {
- var2 = var1.context[var5] == null;
- }
- } else {
- for(int var4 = 0; var4 < var1.context.length && !var2; ++var4) {
- if (var1.context[var4] != null) {
- var2 = this.context[var3].getClass() == var1.context[var4].getClass() && this.context[var3].equals(var1.context[var4]);
- }
- }
- }
-
- if (!var2) {
- return false;
- }
- }
-
- return var2;
- }
-
- public int hashCode() {
- int var1 = 0;
- if (this.context == null) {
- return var1;
- } else {
- for(int var2 = 0; var2 < this.context.length; ++var2) {
- if (this.context[var2] != null) {
- var1 ^= this.context[var2].hashCode();
- }
- }
-
- return var1;
- }
- }
- }
-