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
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