openfire修改程序,使得在同一个分组里的用户,自动和该组admin互为好友,另外当把用户从组里删除时,自动删除和admin之间的好友列表
在group-edit.jsp中,修改程序,标记为黑体为新添加的,
注意在create和update之间需要sleep一段实践,不然可能会造成客户端(spark)处理会有问题,因为spark是并发处理消息的,
<% // Get parameters
boolean add = request.getParameter("add") != null;
boolean delete = request.getParameter("remove") != null;
boolean updateMember = request.getParameter("updateMember") != null;
boolean update = request.getParameter("save") != null;
boolean cancel = request.getParameter("cancel") != null;
String username = ParamUtils.getParameter(request, "username");
String [] adminIDs = ParamUtils.getParameters(request, "admin");
String [] deleteMembers = ParamUtils.getParameters(request, "delete");
String groupName = ParamUtils.getParameter(request, "group");
GroupManager groupManager = webManager.getGroupManager();
boolean groupInfoChanged = ParamUtils.getBooleanParameter(request, "groupChanged", false);
Map<String,String> errors = new HashMap<String,String>();
// Get the presence manager
PresenceManager presenceManager = webManager.getPresenceManager();
UserManager userManager = webManager.getUserManager();
boolean enableRosterGroups = ParamUtils.getBooleanParameter(request,"enableRosterGroups");
boolean shareAdditional = ParamUtils.getParameter(request, "shareContactList") != null;
String groupDisplayName = ParamUtils.getParameter(request,"groupDisplayName");
String showGroup = ParamUtils.getParameter(request,"showGroup");
String[] groupNames = ParamUtils.getParameters(request, "groupNames");
Group group = groupManager.getGroup(groupName);
boolean success;
StringBuffer errorBuf = new StringBuffer();
if (cancel) {
response.sendRedirect("group-summary.jsp");
return;
}
if (update) {
if (enableRosterGroups && (groupDisplayName == null || groupDisplayName.trim().length() == 0)) {
errors.put("groupDisplayName", "");
}
if (errors.isEmpty()) {
if (enableRosterGroups) {
if (showGroup == null || !shareAdditional) {
showGroup = "onlyGroup";
}
if ("spefgroups".equals(showGroup)) {
showGroup = "onlyGroup";
}
else {
groupNames = new String[] {};
}
group.getProperties().put("sharedRoster.showInRoster", showGroup);
if (groupDisplayName != null) {
group.getProperties().put("sharedRoster.displayName", groupDisplayName);
}
group.getProperties().put("sharedRoster.groupList", toList(groupNames, "UTF-8"));
if (!SecurityAuditManager.getSecurityAuditProvider().blockGroupEvents()) {
// Log the event
webManager.logEvent("enabled roster groups for "+groupName, "showinroster = "+showGroup+"\ndisplayname = "+groupDisplayName+"\ngrouplist = "+toList(groupNames, "UTF-8"));
}
}
else {
group.getProperties().put("sharedRoster.showInRoster", "nobody");
group.getProperties().put("sharedRoster.displayName", "");
group.getProperties().put("sharedRoster.groupList", "");
if (!SecurityAuditManager.getSecurityAuditProvider().blockGroupEvents()) {
// Log the event
webManager.logEvent("disabled roster groups for "+groupName, null);
}
}
// Get admin list and compare it the admin posted list.
response.sendRedirect("group-edit.jsp?group=" + URLEncoder.encode(groupName, "UTF-8") + "&groupChanged=true");
return;
}
else {
// Continue editing since there are some errors
updateMember = false;
}
}
if (updateMember) {
Set<JID> adminIDSet = new HashSet<JID>();
for (String adminID : adminIDs) {
JID newAdmin = new JID(adminID);
adminIDSet.add(newAdmin);
boolean isAlreadyAdmin = group.getAdmins().contains(newAdmin);
if (!isAlreadyAdmin) {
// Add new admin
group.getAdmins().add(newAdmin);
Collection<JID> members = group.getMembers();
for(JID member:members){
Roster roster = webManager.getRosterManager().getRoster(member.getNode());
List<String> groups = new ArrayList<String>();
groups.add("\u6211\u7684\u597d\u53cb");
String nickName = UserManager.getInstance().getUser(newAdmin.getNode()).getName();
roster.createRosterItem(newAdmin, nickName, groups, true, true);
Roster roster1 = webManager.getRosterManager().getRoster(newAdmin.getNode());
String nickName1 = UserManager.getInstance().getUser(member.getNode()).getName();
roster1.createRosterItem(member, nickName1, groups, true, true);
try{
Thread.sleep(1000);
}catch(Exception e){
}
RosterItem item = roster.getRosterItem(newAdmin);
item.setNickname(nickName);
item.setSubStatus(RosterItem.SUB_BOTH);
roster.updateRosterItem(item);
RosterItem item1 = roster1.getRosterItem(member);
item1.setNickname(nickName1);
item1.setSubStatus(RosterItem.SUB_BOTH);
roster1.updateRosterItem(item1);
}
}
}
Collection<JID> admins = Collections.unmodifiableCollection(group.getAdmins());
Set<JID> removeList = new HashSet<JID>();
for (JID admin : admins) {
if (!adminIDSet.contains(admin)) {
removeList.add(admin);
}
}
Collection<JID> members = group.getMembers();//JUSTIN added
for (JID member : removeList) {
group.getMembers().add(member);
for(JID jid:members){
Roster roster = webManager.getRosterManager().getRoster(jid.getNode());
roster.deleteRosterItem(member,false);
Roster roster1 = webManager.getRosterManager().getRoster(member.getNode());
roster1.deleteRosterItem(jid,false);
}
}
if (!SecurityAuditManager.getSecurityAuditProvider().blockGroupEvents()) {
// Log the event
// TODO: Should log more here later
webManager.logEvent("updated group membership for "+groupName, null);
}
// Get admin list and compare it the admin posted list.
response.sendRedirect("group-edit.jsp?group=" + URLEncoder.encode(groupName, "UTF-8") + "&updatesuccess=true");
return;
}
else if (add && username != null) {
int count = 0;
username = username.trim();
username = username.toLowerCase();
if (username.indexOf('@') != -1) {
try {
UserManager.getInstance().getUser(JID.escapeNode(username));
// That means that this user has an email address as their node.
username = JID.escapeNode(username);
}
catch (UserNotFoundException e) {
}
}
// Add to group as member by default.
try {
boolean added;
if (username.indexOf('@') == -1) {
// No @ was found so assume this is a JID of a local user
username = JID.escapeNode(username);
username = Stringprep.nodeprep(username);
User user = UserManager.getInstance().getUser(username);
JID newUser = webManager.getXMPPServer().createJID(username, null);
added = group.getMembers().add(newUser);
Collection<JID> admins = group.getAdmins();
for(JID admin:admins){
Roster roster = webManager.getRosterManager().getRoster(admin.getNode());
List<String> groups = new ArrayList<String>();
groups.add("\u6211\u7684\u597d\u53cb");
roster.createRosterItem(newUser, user.getName(), groups, true, true);
Roster roster1 = webManager.getRosterManager().getRoster(newUser.getNode());
String nickName1 = UserManager.getInstance().getUser(admin.getNode()).getName();
roster1.createRosterItem(admin, nickName1, groups, true, true);
try{
Thread.sleep(1000);
}catch(Exception e){
}
RosterItem item = roster.getRosterItem(newUser);
item.setNickname(user.getName());
item.setSubStatus(RosterItem.SUB_BOTH);
roster.updateRosterItem(item);
RosterItem item1 = roster1.getRosterItem(admin);
item1.setNickname(nickName1);
item1.setSubStatus(RosterItem.SUB_BOTH);
roster1.updateRosterItem(item1);
}
}
else {
// Admin entered a JID. Add the JID directly to the list of group members
JID newUser = new JID(username);
added = group.getMembers().add(newUser);
Collection<JID> admins = group.getAdmins();
for(JID admin:admins){
Roster roster = webManager.getRosterManager().getRoster(admin.getNode());
List<String> groups = new ArrayList<String>();
groups.add("\u6211\u7684\u597d\u53cb");
String nickName = UserManager.getInstance().getUser(username).getName();
roster.createRosterItem(newUser, nickName, groups, true, true);
Roster roster1 = webManager.getRosterManager().getRoster(newUser.getNode());
String nickName1 = UserManager.getInstance().getUser(admin.getNode()).getName();
roster1.createRosterItem(admin, nickName1, groups, true, true);
try{
Thread.sleep(1000);
}catch(Exception e){
}
RosterItem item = roster.getRosterItem(newUser);
item.setNickname(nickName);
item.setSubStatus(RosterItem.SUB_BOTH);
roster.updateRosterItem(item);
RosterItem item1 = roster1.getRosterItem(admin);
item1.setNickname(nickName1);
item1.setSubStatus(RosterItem.SUB_BOTH);
roster1.updateRosterItem(item1);
}
if (!SecurityAuditManager.getSecurityAuditProvider().blockGroupEvents()) {
// Log the event
webManager.logEvent("added group member to "+groupName, "username = "+username);
}
}
if (added) {
count++;
}
else {
errorBuf.append("<br>").append(
LocaleUtils.getLocalizedString("group.edit.already_user", Arrays.asList(username)));
}
}
catch (Exception e) {
Log.warn("Problem adding new user to existing group", e);
errorBuf.append("<br>").append(
LocaleUtils.getLocalizedString("group.edit.inexistent_user", Arrays.asList(username)));
}
if (count > 0) {
response.sendRedirect("group-edit.jsp?group=" +
URLEncoder.encode(groupName, "UTF-8") + "&success=true");
return;
}
else {
success = false;
add = true;
}
}
else if(add && username == null){
add = false;
}
else if (delete) {
for (String deleteMember : deleteMembers) {
JID member = new JID(deleteMember);
if(group.getAdmins().contains(member)){
for(JID jid:group.getMembers()){
Roster roster = webManager.getRosterManager().getRoster(jid.getNode());
roster.deleteRosterItem(member,false);
Roster roster1 = webManager.getRosterManager().getRoster(member.getNode());
roster1.deleteRosterItem(jid,false);
}
}else{
for(JID jid:group.getAdmins()){
Roster roster = webManager.getRosterManager().getRoster(jid.getNode());
roster.deleteRosterItem(member,false);
Roster roster1 = webManager.getRosterManager().getRoster(member.getNode());
roster1.deleteRosterItem(jid,false);
}
}
group.getMembers().remove(member);
group.getAdmins().remove(member);
}
response.sendRedirect("group-edit.jsp?group=" + URLEncoder.encode(groupName, "UTF-8") + "&deletesuccess=true");
return;
}
success = groupInfoChanged || "true".equals(request.getParameter("success")) ||
"true".equals(request.getParameter("deletesuccess")) ||
"true".equals(request.getParameter("updatesuccess")) ||
"true".equals(request.getParameter("creategroupsuccess"));
if (errors.size() == 0) {
showGroup = group.getProperties().get("sharedRoster.showInRoster");
enableRosterGroups = !"nobody".equals(showGroup);
shareAdditional = "everybody".equals(showGroup);
if ("onlyGroup".equals(showGroup)) {
String glist = group.getProperties().get("sharedRoster.groupList");
List<String> l = new ArrayList<String>();
if (glist != null) {
StringTokenizer tokenizer = new StringTokenizer(glist,",\t\n\r\f");
while (tokenizer.hasMoreTokens()) {
String tok = tokenizer.nextToken().trim();
l.add(tok.trim());
}
if (!l.isEmpty()) {
shareAdditional = true;
}
}
groupNames = l.toArray(new String[]{});
}
groupDisplayName = group.getProperties().get("sharedRoster.displayName");
}
%>
联系客服