Index: messageforums-app/src/java/org/sakaiproject/tool/messageforums/PrivateMessagesTool.java =================================================================== --- messageforums-app/src/java/org/sakaiproject/tool/messageforums/PrivateMessagesTool.java (revision 133121) +++ messageforums-app/src/java/org/sakaiproject/tool/messageforums/PrivateMessagesTool.java (working copy) @@ -4445,7 +4445,7 @@ //if all users have been selected we may as well return and ignore any other entries return returnSet; } - else if (MembershipItem.TYPE_ROLE.equals(item.getType())){ + else if (MembershipItem.TYPE_ROLE.equals(item.getType()) || MembershipItem.TYPE_MYGROUPROLES.equals(item.getType())){ for (Iterator r = allCourseUsers.iterator(); r.hasNext();){ MembershipItem member = (MembershipItem) r.next(); if (member.getRole().equals(item.getRole())){ @@ -4453,7 +4453,7 @@ } } } - else if (MembershipItem.TYPE_GROUP.equals(item.getType())){ + else if (MembershipItem.TYPE_GROUP.equals(item.getType()) || MembershipItem.TYPE_MYGROUPS.equals(item.getType())){ for (Iterator g = allCourseUsers.iterator(); g.hasNext();){ MembershipItem member = (MembershipItem) g.next(); Set groupMemberSet = item.getGroup().getMembers(); @@ -4465,7 +4465,7 @@ } } } - else if (MembershipItem.TYPE_USER.equals(item.getType())){ + else if (MembershipItem.TYPE_USER.equals(item.getType()) || MembershipItem.TYPE_MYGROUPMEMBERS.equals(item.getType())){ returnSet.put(item.getUser(), bcc); } else{ Index: messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/DefaultPermissionsManagerImpl.java =================================================================== --- messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/DefaultPermissionsManagerImpl.java (revision 133121) +++ messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/DefaultPermissionsManagerImpl.java (working copy) @@ -65,6 +65,18 @@ } if (!registered.contains(DefaultPermissionsManager.MESSAGE_FUNCTION_VIEW_HIDDEN_GROUPS)) { functionManager.registerFunction(DefaultPermissionsManager.MESSAGE_FUNCTION_VIEW_HIDDEN_GROUPS); + } + if (!registered.contains(DefaultPermissionsManager.MESSAGE_FUNCTION_ALLOW_TO_FIELD_USERS)) { + functionManager.registerFunction(DefaultPermissionsManager.MESSAGE_FUNCTION_ALLOW_TO_FIELD_USERS); + } + if (!registered.contains(DefaultPermissionsManager.MESSAGE_FUNCTION_ALLOW_TO_FIELD_MYGROUPS)) { + functionManager.registerFunction(DefaultPermissionsManager.MESSAGE_FUNCTION_ALLOW_TO_FIELD_MYGROUPS); + } + if (!registered.contains(DefaultPermissionsManager.MESSAGE_FUNCTION_ALLOW_TO_FIELD_MYGROUPMEMBERS)) { + functionManager.registerFunction(DefaultPermissionsManager.MESSAGE_FUNCTION_ALLOW_TO_FIELD_MYGROUPMEMBERS); + } + if (!registered.contains(DefaultPermissionsManager.MESSAGE_FUNCTION_ALLOW_TO_FIELD_MYGROUPROLES)) { + functionManager.registerFunction(DefaultPermissionsManager.MESSAGE_FUNCTION_ALLOW_TO_FIELD_MYGROUPROLES); } Index: messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/MembershipManagerImpl.java =================================================================== --- messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/MembershipManagerImpl.java (revision 133121) +++ messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/MembershipManagerImpl.java (working copy) @@ -23,6 +23,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.EnumMap; +import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -50,7 +52,6 @@ import org.sakaiproject.user.api.User; import org.sakaiproject.user.api.UserDirectoryService; import org.sakaiproject.user.api.UserNotDefinedException; - import org.sakaiproject.util.ResourceLoader; public class MembershipManagerImpl implements MembershipManager{ @@ -255,9 +256,9 @@ //FIXME Is this expected behavior? If so it should be documented - LDS LOG.error(e.getMessage(), e); } - + + boolean viewHiddenGroups = getPrtMsgManager().isAllowToViewHiddenGroups(); if(getPrtMsgManager().isAllowToFieldGroups()){ - boolean viewHiddenGroups = getPrtMsgManager().isAllowToViewHiddenGroups(); /** handle groups */ if (currentSite == null) throw new IllegalStateException("Site currentSite == null!"); @@ -295,56 +296,165 @@ } } - /** handle users */ - if (realm == null) - throw new IllegalStateException("AuthzGroup realm == null!"); - Set users = realm.getMembers(); - if (users == null) - throw new RuntimeException("Could not obtain members from realm!"); + if(getPrtMsgManager().isAllowToFieldUsers()){ + /** handle users */ + if (realm == null) + throw new IllegalStateException("AuthzGroup realm == null!"); + Set users = realm.getMembers(); + if (users == null) + throw new RuntimeException("Could not obtain members from realm!"); + + /** create our HashSet of user ids */ + for (Iterator userIterator = users.iterator(); userIterator.hasNext();){ + Member member = (Member) userIterator.next(); + String userId = member.getUserId(); + Role userRole = member.getRole(); + addUsertoMemberItemMap(returnMap, realm, userId, userRole, MembershipItem.TYPE_USER); + } + } - /** create our HashSet of user ids */ - for (Iterator userIterator = users.iterator(); userIterator.hasNext();){ - Member member = (Member) userIterator.next(); - String userId = member.getUserId(); - Role userRole = member.getRole(); - - User user = null; - try{ - if(realm.getMember(userId) != null && realm.getMember(userId).isActive()) - { - user = userDirectoryService.getUser(userId); - } - } catch (UserNotDefinedException e) { - // TODO Auto-generated catch block - // e.printStackTrace(); - LOG.warn(" User " + userId + " not defined"); - } - - if(user != null) - { - MembershipItem memberItem = MembershipItem.getInstance(); - memberItem.setType(MembershipItem.TYPE_USER); - if (ServerConfigurationService.getBoolean("msg.displayEid", true)) { - memberItem.setName(user.getSortName() + " (" + user.getDisplayId() + ")"); - } - else { - memberItem.setName(user.getSortName()); - } - memberItem.setUser(user); - memberItem.setRole(userRole); + if (getPrtMsgManager().isAllowToFieldMyGroups()) { + try { + Collection groups = siteService.getSite(toolManager.getCurrentPlacement().getContext()) + .getGroupsWithMember(userDirectoryService.getCurrentUser().getId()); + if (groups != null) { + for (Group group : groups) { + Set groupMembers = group.getMembers(); + if (groupMembers != null) { + for (Member groupMember : groupMembers) { + MembershipItem member = MembershipItem.getInstance(); + member.setType(MembershipItem.TYPE_MYGROUPS); + member.setName(rl.getFormattedMessage("participants_group_desc", + new Object[] { group.getTitle() })); + member.setGroup(group); - // Don't want admin as part of the list - if(!"admin".equals(userId)) - { - returnMap.put(memberItem.getId(), memberItem); - } - } - } - + if (!isItemAlreadyInMap(returnMap, member)) { + returnMap.put(member.getId(), member); + } + } + } + } + } + } catch (IdUnusedException e) { + LOG.warn("Unable to retrieve site to determine current user's groups."); + } + } + + if (getPrtMsgManager().isAllowToFieldMyGroupMembers()) { + + try { + Collection groups = siteService.getSite(toolManager.getCurrentPlacement().getContext()) + .getGroupsWithMember(userDirectoryService.getCurrentUser().getId()); + if (groups != null) { + for (Group group : groups) { + Set groupMembers = group.getMembers(); + for (Member groupMember : groupMembers) { + addUsertoMemberItemMap(returnMap, realm, groupMember.getUserId(), groupMember.getRole(), + MembershipItem.TYPE_MYGROUPMEMBERS); + } + } + } + } catch (IdUnusedException e) { + LOG.warn("Unable to retrieve site to determine current user's group members."); + } + } + + if (getPrtMsgManager().isAllowToFieldMyGroupRoles()) { + /** handle roles in current user's groups */ + + try { + Collection groups = siteService.getSite(toolManager.getCurrentPlacement().getContext()) + .getGroupsWithMember(userDirectoryService.getCurrentUser().getId()); + if (groups != null) { + for (Group group : groups) { + Set groupRoles = group.getRoles(); + for (Role role : groupRoles) { + MembershipItem member = MembershipItem.getInstance(); + member.setType(MembershipItem.TYPE_MYGROUPROLES); + String roleId = role.getId(); + if (roleId != null && roleId.length() > 0) { + roleId = roleId.substring(0, 1).toUpperCase() + roleId.substring(1); + } + member.setName(rl.getFormattedMessage("group_role_desc", new Object[] { group.getTitle(), roleId })); + member.setRole(role); + + if (!isItemAlreadyInMap(returnMap, member)) { + returnMap.put(member.getId(), member); + } + } + } + } + } catch (IdUnusedException e) { + LOG.warn("Unable to retrieve site to determine current user's group member roles."); + } + } + // set FERPA status for all items in map - allCourseUsers // needed by PrivacyManager to determine status + return setPrivacyStatus(getAllCourseUsers(), returnMap); } + + private void addUsertoMemberItemMap(Map returnMap, AuthzGroup realm, String userId, Role userRole, Integer memberItemType) { + if (!userIsAlreadyInMap(returnMap, userId)) { + + User user = null; + try { + if (realm.getMember(userId) != null && realm.getMember(userId).isActive()) { + user = userDirectoryService.getUser(userId); + } + } catch (UserNotDefinedException e) { + // TODO Auto-generated catch block + // e.printStackTrace(); + LOG.warn(" User " + userId + " not defined"); + } + + // Don't want admin as part of the list + if (user != null && !"admin".equals(userId)) { + MembershipItem memberItem = MembershipItem.getInstance(); + memberItem.setType(memberItemType); + if (ServerConfigurationService.getBoolean("msg.displayEid", true)) { + memberItem.setName(user.getSortName() + " (" + user.getDisplayId() + ")"); + } else { + memberItem.setName(user.getSortName()); + } + memberItem.setUser(user); + memberItem.setRole(userRole); + if (!isItemAlreadyInMap(returnMap, memberItem)) { + returnMap.put(memberItem.getId(), memberItem); + } + } + } + } + + private boolean isItemAlreadyInMap(Map returnMap, MembershipItem membershipItem) { + Iterator iter = returnMap.keySet().iterator(); + while (iter.hasNext()) { + String key = (String) iter.next(); + MembershipItem item = (MembershipItem) returnMap.get(key); + if (membershipItem.getGroup() != null && item.getGroup() != null + && membershipItem.getGroup().getTitle().equals(item.getGroup().getTitle())) { + return true; + } + if (item.getUser() != null && membershipItem.getUser() != null + && item.getUser().getId().equals(membershipItem.getUser().getId())) { + return true; + } + } + return false; + } + + private boolean userIsAlreadyInMap(Map returnMap, String userId) { + Iterator iter = returnMap.keySet().iterator(); + while (iter.hasNext()) { + String key = (String) iter.next(); + MembershipItem item = (MembershipItem) returnMap.get(key); + if (item.getUser() != null && item.getUser().getId().equals(userId)) { + return true; + } + } + return false; + } private boolean containsId(String searchId, List ids){ if(ids != null && searchId != null){ @@ -400,20 +510,15 @@ //user does not exits continue; } - - if(user != null) - { - MembershipItem memberItem = MembershipItem.getInstance(); - memberItem.setType(MembershipItem.TYPE_USER); - memberItem.setName(user.getSortName()); - memberItem.setUser(user); - memberItem.setRole(userRole); - - if(!"admin".equals(userId)) - { - userMap.put(memberItem.getId(), memberItem); - } - } + if(user != null && !"admin".equals(userId)) + { + MembershipItem memberItem = MembershipItem.getInstance(); + memberItem.setType(MembershipItem.TYPE_USER); + memberItem.setName(user.getSortName()); + memberItem.setUser(user); + memberItem.setRole(userRole); + userMap.put(memberItem.getId(), memberItem); + } } return convertMemberMapToList(userMap); Index: messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/ui/PrivateMessageManagerImpl.java =================================================================== --- messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/ui/PrivateMessageManagerImpl.java (revision 133121) +++ messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/ui/PrivateMessageManagerImpl.java (working copy) @@ -1743,6 +1743,74 @@ return false; } + public boolean isAllowToFieldUsers() { + LOG.debug("isAllowToFieldUsers()"); + return isAllowToFieldUsers(UserDirectoryService.getCurrentUser()); + } + + private boolean isAllowToFieldUsers(User user) + { + if (LOG.isDebugEnabled()) + { + LOG.debug("isAllowToFieldUsers(User " + user + ")"); + } + if (user != null) + return SecurityService.unlock(user, DefaultPermissionsManager.MESSAGE_FUNCTION_ALLOW_TO_FIELD_USERS, getContextSiteId()); + else + return false; + } + + public boolean isAllowToFieldMyGroups() { + LOG.debug("isAllowToFieldMyGroups()"); + return isAllowToFieldMyGroups(UserDirectoryService.getCurrentUser()); + } + + private boolean isAllowToFieldMyGroups(User user) + { + if (LOG.isDebugEnabled()) + { + LOG.debug("isAllowToFieldMyGroups(User " + user + ")"); + } + if (user != null) + return SecurityService.unlock(user, DefaultPermissionsManager.MESSAGE_FUNCTION_ALLOW_TO_FIELD_MYGROUPS, getContextSiteId()); + else + return false; + } + + public boolean isAllowToFieldMyGroupMembers() { + LOG.debug("isAllowToFieldMyGroupMembers()"); + return isAllowToFieldMyGroupMembers(UserDirectoryService.getCurrentUser()); + } + + private boolean isAllowToFieldMyGroupMembers(User user) + { + if (LOG.isDebugEnabled()) + { + LOG.debug("isAllowToFieldMyGroupMembers(User " + user + ")"); + } + if (user != null) + return SecurityService.unlock(user, DefaultPermissionsManager.MESSAGE_FUNCTION_ALLOW_TO_FIELD_MYGROUPMEMBERS, getContextSiteId()); + else + return false; + } + + public boolean isAllowToFieldMyGroupRoles() { + LOG.debug("isAllowToFieldMyGroupRoles()"); + return isAllowToFieldMyGroupRoles(UserDirectoryService.getCurrentUser()); + } + + private boolean isAllowToFieldMyGroupRoles(User user) + { + if (LOG.isDebugEnabled()) + { + LOG.debug("isAllowToFieldMyGroupRoles(User " + user + ")"); + } + if (user != null) + return SecurityService.unlock(user, DefaultPermissionsManager.MESSAGE_FUNCTION_ALLOW_TO_FIELD_MYGROUPROLES, getContextSiteId()); + else + return false; + } + /** * @return siteId Index: messageforums-hbm/src/java/org/sakaiproject/component/app/messageforums/MembershipItem.java =================================================================== --- messageforums-hbm/src/java/org/sakaiproject/component/app/messageforums/MembershipItem.java (revision 133121) +++ messageforums-hbm/src/java/org/sakaiproject/component/app/messageforums/MembershipItem.java (working copy) @@ -38,7 +38,10 @@ public static final Integer TYPE_ROLE = Integer.valueOf(2); public static final Integer TYPE_GROUP = Integer.valueOf(3); public static final Integer TYPE_USER = Integer.valueOf(4); - + + public static final Integer TYPE_MYGROUPS = Integer.valueOf(5); + public static final Integer TYPE_MYGROUPMEMBERS = Integer.valueOf(6); + public static final Integer TYPE_MYGROUPROLES = Integer.valueOf(7); public static final String ALL_PARTICIPANTS_DESC = "All Participants"; public static final String NOT_SPECIFIED_DESC = "Not Specified"; Index: messageforums-api/src/bundle/org/sakaiproject/api/app/messagecenter/bundle/permissions.properties =================================================================== --- messageforums-api/src/bundle/org/sakaiproject/api/app/messagecenter/bundle/permissions.properties (revision 133121) +++ messageforums-api/src/bundle/org/sakaiproject/api/app/messagecenter/bundle/permissions.properties (working copy) @@ -2,3 +2,7 @@ desc-msg.permissions.allowToField.allParticipants=Allow the 'All Participants' option in the "To" field desc-msg.permissions.allowToField.roles=Allow Roles in the "To" field desc-msg.permissions.viewHidden.groups=View Hidden Groups in the "To" field +desc-msg.permissions.allowToField.users=Allow Users in the "To" field +desc-msg.permissions.allowToField.myGroups=Allow my Groups in the "To" field +desc-msg.permissions.allowToField.myGroupMembers=Allow my Group Members in the "To" field +desc-msg.permissions.allowToField.myGroupRoles=Allow my Group Roles in the "To" field Index: messageforums-api/src/bundle/org/sakaiproject/api/app/messagecenter/bundle/Messages.properties =================================================================== --- messageforums-api/src/bundle/org/sakaiproject/api/app/messagecenter/bundle/Messages.properties (revision 133121) +++ messageforums-api/src/bundle/org/sakaiproject/api/app/messagecenter/bundle/Messages.properties (working copy) @@ -720,6 +720,7 @@ all_participants_desc=All Participants participants_group_desc={0} Group participants_role_desc={0} Role +group_role_desc=[{0}] {1} Role area_restricted_message=Template is in restricted availability mode forum_restricted_message=Forum is in restricted availability mode Index: messageforums-api/src/java/org/sakaiproject/api/app/messageforums/ui/PrivateMessageManager.java =================================================================== --- messageforums-api/src/java/org/sakaiproject/api/app/messageforums/ui/PrivateMessageManager.java (revision 133121) +++ messageforums-api/src/java/org/sakaiproject/api/app/messageforums/ui/PrivateMessageManager.java (working copy) @@ -195,7 +195,11 @@ public boolean isAllowToFieldAllParticipants(); public boolean isAllowToFieldRoles(); public boolean isAllowToViewHiddenGroups(); - + public boolean isAllowToFieldUsers(); + public boolean isAllowToFieldMyGroups(); + public boolean isAllowToFieldMyGroupMembers(); + public boolean isAllowToFieldMyGroupRoles(); + public PrivateMessage getNextMessage(PrivateMessage message); public PrivateMessage getPreviousMessage(PrivateMessage message); public boolean hasPreviousMessage(PrivateMessage message); Index: messageforums-api/src/java/org/sakaiproject/api/app/messageforums/DefaultPermissionsManager.java =================================================================== --- messageforums-api/src/java/org/sakaiproject/api/app/messageforums/DefaultPermissionsManager.java (revision 133121) +++ messageforums-api/src/java/org/sakaiproject/api/app/messageforums/DefaultPermissionsManager.java (working copy) @@ -50,6 +50,10 @@ public static final String MESSAGE_FUNCTION_ALLOW_TO_FIELD_ALL_PARTICIPANTS = MESSAGE_FUNCTION_PREFIX + MESSAGE_FUNCITON_PREFIX_PERMISSIONS + "allowToField.allParticipants"; public static final String MESSAGE_FUNCTION_ALLOW_TO_FIELD_ROLES = MESSAGE_FUNCTION_PREFIX + MESSAGE_FUNCITON_PREFIX_PERMISSIONS + "allowToField.roles"; public static final String MESSAGE_FUNCTION_VIEW_HIDDEN_GROUPS = MESSAGE_FUNCTION_PREFIX + MESSAGE_FUNCITON_PREFIX_PERMISSIONS + "viewHidden.groups"; + public static final String MESSAGE_FUNCTION_ALLOW_TO_FIELD_USERS = MESSAGE_FUNCTION_PREFIX + MESSAGE_FUNCITON_PREFIX_PERMISSIONS + "allowToField.users"; + public static final String MESSAGE_FUNCTION_ALLOW_TO_FIELD_MYGROUPS = MESSAGE_FUNCTION_PREFIX + MESSAGE_FUNCITON_PREFIX_PERMISSIONS + "allowToField.myGroups"; + public static final String MESSAGE_FUNCTION_ALLOW_TO_FIELD_MYGROUPMEMBERS = MESSAGE_FUNCTION_PREFIX + MESSAGE_FUNCITON_PREFIX_PERMISSIONS + "allowToField.myGroupMembers"; + public static final String MESSAGE_FUNCTION_ALLOW_TO_FIELD_MYGROUPROLES = MESSAGE_FUNCTION_PREFIX + MESSAGE_FUNCITON_PREFIX_PERMISSIONS + "allowToField.myGroupRoles"; // control permissions