001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.jmx.connector.invoker;
023:
024: import java.security.AccessController;
025: import java.security.Principal;
026: import java.security.PrivilegedAction;
027: import javax.security.auth.Subject;
028:
029: import org.jboss.security.SecurityAssociation;
030:
031: /** Common PrivilegedAction used by classes in this package.
032: *
033: * @author Scott.Stark@jboss.org
034: * @version $Revison:$
035: */
036: class SecurityActions {
037: private static class GetSubjectAction implements PrivilegedAction {
038: static PrivilegedAction ACTION = new GetSubjectAction();
039:
040: public Object run() {
041: Subject subject = SecurityAssociation.getSubject();
042: return subject;
043: }
044: }
045:
046: private static class GetTCLAction implements PrivilegedAction {
047: static PrivilegedAction ACTION = new GetTCLAction();
048:
049: public Object run() {
050: ClassLoader loader = Thread.currentThread()
051: .getContextClassLoader();
052: return loader;
053: }
054: }
055:
056: private static class SetTCLAction implements PrivilegedAction {
057: ClassLoader loader;
058:
059: SetTCLAction(ClassLoader loader) {
060: this .loader = loader;
061: }
062:
063: public Object run() {
064: Thread.currentThread().setContextClassLoader(loader);
065: loader = null;
066: return null;
067: }
068: }
069:
070: interface PrincipalInfoAction {
071: PrincipalInfoAction PRIVILEGED = new PrincipalInfoAction() {
072: public void push(final Principal principal,
073: final Object credential, final Subject subject) {
074: AccessController.doPrivileged(new PrivilegedAction() {
075: public Object run() {
076: SecurityAssociation.pushSubjectContext(subject,
077: principal, credential);
078: return null;
079: }
080: });
081: }
082:
083: public void pop() {
084: AccessController.doPrivileged(new PrivilegedAction() {
085: public Object run() {
086: SecurityAssociation.popSubjectContext();
087: return null;
088: }
089: });
090: }
091: };
092:
093: PrincipalInfoAction NON_PRIVILEGED = new PrincipalInfoAction() {
094: public void push(Principal principal, Object credential,
095: Subject subject) {
096: SecurityAssociation.pushSubjectContext(subject,
097: principal, credential);
098: }
099:
100: public void pop() {
101: SecurityAssociation.popSubjectContext();
102: }
103: };
104:
105: void push(Principal principal, Object credential,
106: Subject subject);
107:
108: void pop();
109: }
110:
111: static Subject getActiveSubject() {
112: Subject subject = (Subject) AccessController
113: .doPrivileged(GetSubjectAction.ACTION);
114: return subject;
115: }
116:
117: static ClassLoader getContextClassLoader() {
118: ClassLoader loader = (ClassLoader) AccessController
119: .doPrivileged(GetTCLAction.ACTION);
120: return loader;
121: }
122:
123: static void setContextClassLoader(ClassLoader loader) {
124: PrivilegedAction action = new SetTCLAction(loader);
125: AccessController.doPrivileged(action);
126: }
127:
128: static void pushSubjectContext(Principal principal,
129: Object credential, Subject subject) {
130: if (System.getSecurityManager() == null) {
131: PrincipalInfoAction.NON_PRIVILEGED.push(principal,
132: credential, subject);
133: } else {
134: PrincipalInfoAction.PRIVILEGED.push(principal, credential,
135: subject);
136: }
137: }
138:
139: static void popSubjectContext() {
140: if (System.getSecurityManager() == null) {
141: PrincipalInfoAction.NON_PRIVILEGED.pop();
142: } else {
143: PrincipalInfoAction.PRIVILEGED.pop();
144: }
145: }
146: }
|