SecurityContext.java

00001 
00028 package org.objectweb.security.context;
00029 
00030 import java.io.Serializable;
00031 import java.security.Principal;
00032 import java.util.ArrayList;
00033 import java.util.Iterator;
00034 
00035 import org.objectweb.jonas.security.jacc.JPolicyUserRoleMapping;
00036 
00044 public class SecurityContext implements Serializable {
00045 
00049     private String principalName = null;
00050 
00054     private final String[] roles;
00055 
00060     private ArrayList runAsRoleStack = null;
00061 
00065     private ArrayList runAsPrincipalStack = null;
00066 
00071     private ArrayList runAsPrincipalRolesStack = null;
00072 
00076     public SecurityContext() {
00077         this("ANONYMOUS");
00078     }
00079 
00085     public SecurityContext(String principalName, String[] roles) {
00086         this.principalName = principalName;
00087         this.roles = roles;
00088     }
00089 
00095     public SecurityContext(String principalName, ArrayList arrayRoles) {
00096         this(principalName, arrayRoles, null, null, null);
00097     }
00098 
00108     protected SecurityContext(String principalName, ArrayList arrayRoles, ArrayList arrayRunas, ArrayList arrayRunasPrincipal, ArrayList arrayRunasPrincipalRoles) {
00109         this.principalName = principalName;
00110         String[] overridedRoles = JPolicyUserRoleMapping.getGlobalMappingForPrincipal(principalName);
00111         if (overridedRoles != null) {
00112             this.roles = overridedRoles;
00113         } else {
00114             if (arrayRoles != null) {
00115                 //Convert list into array
00116                 String[] r = new String[arrayRoles.size()];
00117                 r = (String[]) arrayRoles.toArray(r);
00118                 this.roles = r;
00119             } else {
00120                 this.roles = null;
00121             }
00122         }
00123 
00124         this.runAsRoleStack = arrayRunas;
00125         this.runAsPrincipalStack = arrayRunasPrincipal;
00126         this.runAsPrincipalRolesStack = arrayRunasPrincipalRoles;
00127     }
00128 
00133     public SecurityContext(String principalName) {
00134         this.principalName = principalName;
00135         this.roles = new String[] {"JOnAS"};
00136     }
00137 
00145     public Principal getCallerPrincipal(boolean inRunAs) {
00146         return new InternalPrincipal(inRunAs);
00147     }
00148 
00154     public String[] getCallerPrincipalRoles(boolean inRunAs) {
00155         String[] runAsRoles = null;
00156         if (inRunAs) {
00157             runAsRoles = peekLastRunAsPrincipalRoles();
00158         } else {
00159             runAsRoles = peekRunAsPrincipalRoles();
00160         }
00161         if (runAsRoles != null) {
00162             return runAsRoles;
00163         } else {
00164             return roles;
00165         }
00166     }
00167 
00172     public void pushRunAsRole(String role) {
00173         getRunAsRoleStack().add(role);
00174     }
00175 
00182     public void pushRunAsPrincipal(String principalName, String[] roles) {
00183         getRunAsPrincipalStack().add(principalName);
00184         getRunAsPrincipalRolesStack().add(roles);
00185     }
00186 
00190     public void popRunAs() {
00191         if (!getRunAsRoleStack().isEmpty()) {
00192             getRunAsRoleStack().remove(getRunAsRoleStack().size() - 1);
00193         }
00194         if (!getRunAsPrincipalStack().isEmpty()) {
00195             getRunAsPrincipalStack().remove(getRunAsPrincipalStack().size() - 1);
00196         }
00197         if (!getRunAsPrincipalRolesStack().isEmpty()) {
00198             getRunAsPrincipalRolesStack().remove(getRunAsPrincipalRolesStack().size() - 1);
00199         }
00200     }
00201 
00207     public String peekRunAsRole() {
00208         if (getRunAsRoleStack().isEmpty()) {
00209             return null;
00210         } else {
00211             return (String) getRunAsRoleStack().get(getRunAsRoleStack().size() - 1);
00212         }
00213     }
00214 
00220     public String peekRunAsPrincipal() {
00221         if (getRunAsPrincipalStack().isEmpty()) {
00222             return null;
00223         } else {
00224             return (String) getRunAsPrincipalStack().get(getRunAsPrincipalStack().size() - 1);
00225         }
00226     }
00227 
00233     public String peekLastRunAsPrincipal() {
00234         if (getRunAsPrincipalStack().size() < 2) {
00235             return null;
00236         } else {
00237             return (String) getRunAsPrincipalStack().get(getRunAsPrincipalStack().size() - 2);
00238         }
00239     }
00240 
00246     public String[] peekRunAsPrincipalRoles() {
00247         if (getRunAsPrincipalRolesStack().isEmpty()) {
00248             return null;
00249         } else {
00250             return (String[]) getRunAsPrincipalRolesStack().get(getRunAsPrincipalRolesStack().size() - 1);
00251         }
00252     }
00253 
00259     public String[] peekLastRunAsPrincipalRoles() {
00260         if (getRunAsPrincipalRolesStack().size() < 2) {
00261             return null;
00262         } else {
00263             return (String[]) getRunAsPrincipalRolesStack().get(getRunAsPrincipalRolesStack().size() - 2);
00264         }
00265     }
00266 
00271     public ArrayList getRunAsRoleStack() {
00272         if (runAsRoleStack == null) {
00273             runAsRoleStack = new ArrayList();
00274         }
00275         return runAsRoleStack;
00276     }
00277 
00282     public ArrayList getRunAsPrincipalRolesStack() {
00283         if (runAsPrincipalRolesStack == null) {
00284             runAsPrincipalRolesStack = new ArrayList();
00285         }
00286         return runAsPrincipalRolesStack;
00287     }
00288 
00293     public ArrayList getRunAsPrincipalStack() {
00294         if (runAsPrincipalStack == null) {
00295             runAsPrincipalStack = new ArrayList();
00296         }
00297         return runAsPrincipalStack;
00298     }
00299 
00304     public String toString() {
00305         String txt = "principal : name = " + principalName + "\n";
00306         if (roles != null) {
00307             for (int i = 0; i < roles.length; i++) {
00308                 txt += "role[" + i + "] = " + roles[i] + "\n";
00309             }
00310         }
00311         if (runAsRoleStack != null) {
00312             Iterator iRunas = runAsRoleStack.iterator();
00313             int i = 0;
00314             while (iRunas.hasNext()) {
00315                 txt += "runas[" + i + "] = " + ((String) iRunas.next()) + "\n";
00316             }
00317         }
00318         return txt;
00319     }
00320 
00325     protected String getPrincipalName(boolean runningRunAs) {
00326         String principal = null;
00327         if (runningRunAs) {
00328             principal = peekLastRunAsPrincipal();
00329         } else {
00330             principal = peekRunAsPrincipal();
00331         }
00332         if (principal != null) {
00333             return principal;
00334         } else {
00335             return principalName;
00336         }
00337     }
00338 
00342     public String getPrincipalName() {
00343         return principalName;
00344     }
00345 
00349     protected String[] getRoles() {
00350         return roles;
00351     }
00352 
00356     class InternalPrincipal implements Principal {
00357 
00363         private boolean inRunAs = false;
00364 
00369         public InternalPrincipal(boolean inRunAs) {
00370             super();
00371             this.inRunAs = inRunAs;
00372 
00373         }
00374 
00378         public String getName() {
00379             return getPrincipalName(inRunAs);
00380         }
00381 
00386         public boolean equals(Object o) {
00387             if (o instanceof Principal) {
00388                 return getPrincipalName(inRunAs).equals(((Principal) o).getName());
00389             }
00390             return false;
00391         }
00392 
00397         public int hashCode() {
00398             return getPrincipalName(inRunAs).hashCode();
00399         }
00400 
00405         public String toString() {
00406             return "name = " + getPrincipalName(inRunAs);
00407         }
00408     };
00409 
00410 }
00411 

Generated on Tue Feb 15 15:06:03 2005 for JOnAS by  doxygen 1.3.9.1