Class DefaultGroupManager
- java.lang.Object
-
- org.apache.wiki.auth.authorize.DefaultGroupManager
-
- All Implemented Interfaces:
java.util.EventListener
,Initializable
,GroupManager
,Authorizer
,WikiEventListener
public class DefaultGroupManager extends java.lang.Object implements GroupManager, Authorizer, WikiEventListener
Facade class for storing, retrieving and managing wiki groups on behalf of AuthorizationManager, JSPs and other presentation-layer classes. GroupManager works in collaboration with a back-end
GroupDatabase
, which persists groups to permanent storage.Note: prior to JSPWiki 2.4.19, GroupManager was an interface; it is now a concrete, final class. The aspects of GroupManager which previously extracted group information from storage (e.g., wiki pages) have been refactored into the GroupDatabase interface.
- Since:
- 2.4.19
-
-
Field Summary
Fields Modifier and Type Field Description protected Engine
m_engine
protected WikiEventListener
m_groupListener
-
Fields inherited from interface org.apache.wiki.auth.authorize.GroupManager
MESSAGES_KEY, PROP_GROUPDATABASE
-
-
Constructor Summary
Constructors Constructor Description DefaultGroupManager()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
actionPerformed(WikiEvent event)
Fired when a WikiEvent is triggered by an event source.void
addWikiEventListener(WikiEventListener listener)
Registers a WikiEventListener with this instance.void
checkGroupName(Context context, java.lang.String name)
Checks if a String is blank or a restricted Group name, and if it is, appends an error to the Session's message list.protected java.lang.String[]
extractMembers(java.lang.String memberLine)
Extracts carriage-return separated members into a Set of String objects.java.security.Principal
findRole(java.lang.String name)
Looks up and returns a role Principal matching a given String.Group
getGroup(java.lang.String name)
Returns the Group matching a given name.GroupDatabase
getGroupDatabase()
Returns the current externalGroupDatabase
in use.java.security.Principal[]
getRoles()
Returns an array of role Principals this Authorizer knows about.void
initialize(Engine engine, java.util.Properties props)
Initializes this Engine component.boolean
isUserInRole(Session session, java.security.Principal role)
Determines whether the Subject associated with a WikiSession is in a particular role.Group
parseGroup(java.lang.String name, java.lang.String memberLine, boolean create)
Extracts group name and members from passed parameters and populates an existing Group with them.void
removeGroup(java.lang.String index)
Removes a named Group from the group database.void
removeWikiEventListener(WikiEventListener listener)
Un-registers a WikiEventListener with this instance.void
setGroup(Session session, Group group)
Saves theGroup
created by a user in a wiki session.void
validateGroup(Context context, Group group)
Validates a Group, and appends any errors to the session errors list.-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.apache.wiki.auth.authorize.GroupManager
fireEvent, parseGroup
-
-
-
-
Field Detail
-
m_groupListener
protected WikiEventListener m_groupListener
-
-
Constructor Detail
-
DefaultGroupManager
public DefaultGroupManager()
-
-
Method Detail
-
findRole
public java.security.Principal findRole(java.lang.String name)
Looks up and returns a role Principal matching a given String. If a matching role cannot be found, this method returnsnull
. Note that it may not always be feasible for an Authorizer implementation to return a role Principal.- Specified by:
findRole
in interfaceAuthorizer
- Parameters:
name
- the name of the role to retrieve- Returns:
- the role Principal
-
getGroup
public Group getGroup(java.lang.String name) throws NoSuchPrincipalException
Returns the Group matching a given name. If the group cannot be found, this method throws aNoSuchPrincipalException
.- Specified by:
getGroup
in interfaceGroupManager
- Parameters:
name
- the name of the group to find- Returns:
- the group
- Throws:
NoSuchPrincipalException
- if the group cannot be found
-
getGroupDatabase
public GroupDatabase getGroupDatabase() throws WikiSecurityException
Returns the current externalGroupDatabase
in use. This method is guaranteed to return a properly-initialized GroupDatabase, unless it could not be initialized. In that case, this method throws aWikiException
. The GroupDatabase is lazily initialized.- Specified by:
getGroupDatabase
in interfaceGroupManager
- Returns:
- the current GroupDatabase
- Throws:
WikiSecurityException
- if the GroupDatabase could not be initialized
-
getRoles
public java.security.Principal[] getRoles()
Returns an array of role Principals this Authorizer knows about. This method will always return an array; an implementing class may choose to return an zero-length array if it has no ability to identify the roles under its control.- Specified by:
getRoles
in interfaceAuthorizer
- Returns:
- an array of Principals representing the roles
-
initialize
public void initialize(Engine engine, java.util.Properties props) throws WikiSecurityException
Initializes this Engine component. Note that the engine is not fully initialized at this point, so don't do anything fancy here - use lazy init, if you have to.
- Specified by:
initialize
in interfaceAuthorizer
- Specified by:
initialize
in interfaceInitializable
- Parameters:
engine
- Engine performing the initialization.props
- Properties for setup.- Throws:
WikiSecurityException
- if the Authorizer could not be initialized
-
isUserInRole
public boolean isUserInRole(Session session, java.security.Principal role)
Determines whether the Subject associated with a WikiSession is in a particular role. This method takes two parameters: the WikiSession containing the subject and the desired role ( which may be a Role or a Group). If either parameter isnull
, this method must returnfalse
.- Specified by:
isUserInRole
in interfaceAuthorizer
- Parameters:
session
- the current WikiSessionrole
- the role to check- Returns:
true
if the user is considered to be in the role,false
otherwise
-
parseGroup
public Group parseGroup(java.lang.String name, java.lang.String memberLine, boolean create) throws WikiSecurityException
Extracts group name and members from passed parameters and populates an existing Group with them. The Group will either be a copy of an existing Group (if one can be found), or a new, unregistered Group (if not). Optionally, this method can throw a WikiSecurityException if the Group does not yet exist in the GroupManager cache.
The
group
parameter in the HTTP request contains the Group name to look up and populate. Themembers
parameter contains the member list. If these differ from those in the existing group, the passed values override the old values.This method does not commit the new Group to the GroupManager cache. To do that, use
GroupManager.setGroup(Session, Group)
.- Specified by:
parseGroup
in interfaceGroupManager
- Parameters:
name
- the name of the group to constructmemberLine
- the line of text containing the group membership listcreate
- whether this method should create a new, empty Group if one with the requested name is not found. Iffalse
, groups that do not exist will cause aNoSuchPrincipalException
to be thrown- Returns:
- a new, populated group
- Throws:
WikiSecurityException
- if the group name isn't allowed, or ifcreate
isfalse
and the Group namedname
does not exist- See Also:
Group.RESTRICTED_GROUPNAMES
-
removeGroup
public void removeGroup(java.lang.String index) throws WikiSecurityException
Removes a named Group from the group database. If not found, throws aNoSuchPrincipalException
. After removal, this method will commit the delete to the back-end group database. It will also fire aWikiSecurityEvent.GROUP_REMOVE
event with the GroupManager instance as the source and the Group as target. Ifindex
isnull
, this method throws anIllegalArgumentException
.- Specified by:
removeGroup
in interfaceGroupManager
- Parameters:
index
- the group to remove- Throws:
WikiSecurityException
- if the Group cannot be removed by the back-end- See Also:
GroupDatabase.delete(Group)
-
setGroup
public void setGroup(Session session, Group group) throws WikiSecurityException
Saves the
Group
created by a user in a wiki session. This method registers the Group with the GroupManager and saves it to the back-end database. If an existing Group with the same name already exists, the new group will overwrite it. After saving the Group, the group database changes are committed.This method fires the following events:
- When creating a new Group, this method fires a
WikiSecurityEvent.GROUP_ADD
with the GroupManager instance as its source and the new Group as the target. - When overwriting an existing Group, this method fires a new
WikiSecurityEvent.GROUP_REMOVE
with this GroupManager instance as the source, and the new Group as the target. It then fires aWikiSecurityEvent.GROUP_ADD
event with the same source and target.
In addition, if the save or commit actions fail, this method will attempt to restore the older version of the wiki group if it exists. This will result in a
GROUP_REMOVE
event (for the new version of the Group) followed by aGROUP_ADD
event (to indicate restoration of the old version).This method will register the new Group with the GroupManager. For example,
AuthenticationManager
attaches each Session as a GroupManager listener. Thus, the act of registering a Group withsetGroup
means that all Sessions will automatically receive group add/change/delete events immediately.- Specified by:
setGroup
in interfaceGroupManager
- Parameters:
session
- the wiki session, which may not benull
group
- the Group, which may not benull
- Throws:
WikiSecurityException
- if the Group cannot be saved by the back-end
- When creating a new Group, this method fires a
-
validateGroup
public void validateGroup(Context context, Group group)
Validates a Group, and appends any errors to the session errors list. Any validation errors are added to the wiki session's messages collection (seeSession.getMessages()
.- Specified by:
validateGroup
in interfaceGroupManager
- Parameters:
context
- the current wiki contextgroup
- the supplied Group
-
checkGroupName
public void checkGroupName(Context context, java.lang.String name) throws WikiSecurityException
Checks if a String is blank or a restricted Group name, and if it is, appends an error to the Session's message list.- Specified by:
checkGroupName
in interfaceGroupManager
- Parameters:
context
- the wiki contextname
- the Group name to test- Throws:
WikiSecurityException
- ifsession
isnull
or the Group name is illegal- See Also:
Group.RESTRICTED_GROUPNAMES
-
extractMembers
protected java.lang.String[] extractMembers(java.lang.String memberLine)
Extracts carriage-return separated members into a Set of String objects.- Parameters:
memberLine
- the list of members- Returns:
- the list of members
-
addWikiEventListener
public void addWikiEventListener(WikiEventListener listener)
Registers a WikiEventListener with this instance. This is a convenience method.- Specified by:
addWikiEventListener
in interfaceGroupManager
- Parameters:
listener
- the event listener
-
removeWikiEventListener
public void removeWikiEventListener(WikiEventListener listener)
Un-registers a WikiEventListener with this instance. This is a convenience method.- Specified by:
removeWikiEventListener
in interfaceGroupManager
- Parameters:
listener
- the event listener
-
actionPerformed
public void actionPerformed(WikiEvent event)
Fired when a WikiEvent is triggered by an event source.- Specified by:
actionPerformed
in interfaceWikiEventListener
- Parameters:
event
- a WikiEvent object
-
-