001: /*
002: * JOSSO: Java Open Single Sign-On
003: *
004: * Copyright 2004-2008, Atricore, Inc.
005: *
006: * This is free software; you can redistribute it and/or modify it
007: * under the terms of the GNU Lesser General Public License as
008: * published by the Free Software Foundation; either version 2.1 of
009: * the License, or (at your option) any later version.
010: *
011: * This software is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this software; if not, write to the Free
018: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
019: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
020: */
021:
022: package org.josso.wls92.agent.jaas;
023:
024: import org.josso.gateway.identity.SSORole;
025: import org.josso.gateway.identity.service.BaseRole;
026: import weblogic.security.principal.WLSAbstractPrincipal;
027:
028: import java.security.Principal;
029: import java.util.*;
030:
031: /**
032: * This principal extends Weblogic abstract principal, implementing also SSORole interface.
033: * WebLogic exptects principals to implement WLUser and WLRole interfaces.
034: *
035: * Date: Nov 26, 2007
036: * Time: 7:35:45 PM
037: *
038: * @author <a href="mailto:sgonzalez@josso.org">Sebastian Gonzalez Oyuela</a>
039: */
040: public class WLSJOSSORole extends WLSAbstractPrincipal implements
041: BaseRole {
042:
043: private SSORole ssoRole;
044: private HashMap members;
045:
046: public WLSJOSSORole(SSORole role) {
047: this ();
048: this .ssoRole = role;
049: this .setName(role.getName());
050: }
051:
052: public WLSJOSSORole() {
053: members = new HashMap(5);
054: }
055:
056: /**
057: * Adds the specified member to the group.
058: *
059: * @param user the principal to add to this group.
060: * @return true if the member was successfully added,
061: * false if the principal was already a member.
062: */
063: public boolean addMember(Principal user) {
064: boolean isMember = members.containsKey(user);
065: if (isMember == false)
066: members.put(user, user);
067: return isMember == false;
068: }
069:
070: /**
071: * Returns true if the passed principal is a member of the group.
072: * This method does a recursive search, so if a principal belongs to a
073: * group which is a member of this group, true is returned.
074: * <p/>
075: * A special check is made to see if the member is an instance of
076: * org.jboss.security.AnybodyPrincipal or org.jboss.security.NobodyPrincipal
077: * since these classes do not hash to meaningful values.
078: *
079: * @param member the principal whose membership is to be checked.
080: * @return true if the principal is a member of this group,
081: * false otherwise.
082: */
083: public boolean isMember(Principal member) {
084: // logger.debug("Begin, isMember");
085:
086: // First see if there is a key with the member name
087: boolean isMember = members.containsKey(member);
088: if (isMember == false) { // Check any Groups for membership
089: Collection values = members.values();
090: Iterator iter = values.iterator();
091: while (isMember == false && iter.hasNext()) {
092: Object next = iter.next();
093: if (next instanceof BaseRole) {
094: BaseRole role = (BaseRole) next;
095: isMember = role.isMember(member);
096: }
097: }
098: }
099:
100: // logger.debug("End, isMember, return=" + isMember);
101: return isMember;
102: }
103:
104: /**
105: * Returns an enumeration of the members in the group.
106: * The returned objects can be instances of either Principal
107: * or Group (which is a subinterface of Principal).
108: *
109: * @return an enumeration of the group members.
110: */
111: public Enumeration members() {
112: return Collections.enumeration(members.values());
113: }
114:
115: /**
116: * Removes the specified member from the group.
117: *
118: * @param user the principal to remove from this group.
119: * @return true if the principal was removed, or
120: * false if the principal was not a member.
121: */
122: public boolean removeMember(Principal user) {
123: Object prev = members.remove(user);
124: return prev != null;
125: }
126:
127: public String getName() {
128: return this .ssoRole.getName();
129: }
130:
131: public void setName(String name) {
132:
133: // Keep name in sync
134: if (ssoRole instanceof BaseRole)
135: ((BaseRole) this .ssoRole).setName(name);
136:
137: super .setName(name);
138: }
139:
140: public String toString() {
141: StringBuffer tmp = new StringBuffer(getName());
142: tmp.append("(members:");
143: Iterator iter = members.keySet().iterator();
144: while (iter.hasNext()) {
145: tmp.append(iter.next());
146: tmp.append(',');
147: }
148: tmp.setCharAt(tmp.length() - 1, ')');
149: return tmp.toString();
150: }
151: }
|