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"); } %>
相关推荐
Openfire 是一个基于 XMPP 协议的实时通信服务器,它允许用户进行即时消息传递、群聊和其他形式的交互。在 Openfire 中,好友关系管理是核心功能之一,涉及到数据包交换和数据库状态的更新。以下是对 Openfire 好友...
- **创建用户组**:在Openfire管理控制台,管理员可以创建用户组,将用户分配到不同的组,便于权限管理和沟通组织。 - **扩展用户组**:通过API或插件,可以实现动态创建和管理用户组,比如根据部门或项目自动...
在Android平台上,为了与Openfire服务器进行交互,通常需要一个客户端应用程序来完成连接、登录、发送和接收消息等功能。这个“android Openfire的测试客户端程序”就是这样一个示例应用,用于开发者调试和理解...
在Openfire中,用户可以通过添加好友来建立联系人列表,从而实现消息的发送和接收。下面将详细解释Openfire中添加好友的过程以及涉及到的相关概念。 1. **Presence包与类型**: - `unavailable`: 用户下线或者离线...
这里的"127.0.0.1"是本地主机地址,"8080"是OpenFire服务器运行的端口,"/plugins"表示服务器提供的插件服务,"onlineuser"可能是处理在线用户查询的特定插件名,而"getallusers"则可能是该插件提供的一个API端点,...
在企业级即时通讯系统部署过程中,为了确保数据的一致性和提高用户体验,通常会遇到一个关键需求:将Openfire服务器与现有的用户数据库进行集成。这样的集成可以实现统一的用户认证管理、避免数据冗余,并能充分利用...
本文将深入探讨MQ与Openfire的结合,以及如何实现一个增强版的即时通讯系统,特别是在信息推送、个性化特性以及日志管理方面的改进。 首先,ActiveMQ是Apache软件基金会下的一个开源消息中间件,它是基于Java ...
Qt是一个跨平台的C++图形用户界面应用程序开发框架,而QXMPP则是一个用于Qt的轻量级XMPP库,它允许开发者轻松地在Qt应用程序中实现XMPP功能,包括登录、发送和接收消息、管理联系人列表等。 【知识点详解】 1. **...
"mucautojoin"这个文件名可能是这个实现用户自动入群功能的插件名称,它可能包含了必要的代码和配置文件,用于处理用户加入群组的逻辑。 在Openfire中,要实现用户入群的Web接口,通常需要以下步骤: 1. **安装...
下面我们将深入探讨Openfire的核心特性和在Windows上的安装与配置过程。 1. **Openfire的主要特性** - **跨平台性**:由于其基于Java,Openfire可以在多种操作系统上运行,包括Windows、Linux和Mac OS。 - **XMPP...
1. ofGroup: 这个表存储用户组的信息,包括组名称和描述。每个组都有一个唯一的主键`groupName`,允许快速查找和操作特定的用户组。`description`字段则用于记录组的详细描述。 2. ofGroupProp: 此表关联了组属性,...
Openfire是一个基于XMPP协议的即时通讯服务器,提供了强大的聊天功能和插件架构。本手册将指导您搭建开发环境,安装和配置Openfire服务器。 一、 搭建开发环境 要搭建开发环境,需要安装以下软件: * windowsXP...
1. **Openfire 3.9.3 版本**:这个版本是Openfire的一个稳定发行版,发布于2015年。它包含了对之前版本的一些错误修复、性能优化以及新功能的添加。对于Windows操作系统,它提供了易于安装的.exe文件,方便用户快速...
总的来说,"基于Openfire 仿QQ"项目展示了如何利用开源技术实现一个功能完备的即时通讯应用,涉及到Android客户端开发、服务器集成、即时通讯协议、用户体验优化等多个方面,对于学习和研究即时通讯系统有着很高的...
Openfire是一款开源的即时通讯(IM)服务器,它基于XMPP协议,允许用户进行实时通信和协作。在Openfire中,插件是扩展其功能的关键方式。本教程将引导初学者了解如何开发第一个Openfire插件,从而深入理解Openfire的...
3. **Webchat**:Openfire Webchat是Openfire附带的一个Web应用程序,允许用户通过浏览器与Openfire服务器建立连接并进行即时通讯。它通常依赖于Strophe.js,这是一个JavaScript库,实现了XMPP协议的客户端部分。 4...
1. 数据安全:在Android客户端和Openfire服务器间使用SSL/TLS加密,保护用户隐私。 2. 性能优化:合理设计消息推送策略,避免过度耗电和网络资源。 3. 异常处理:对网络断开、服务器异常等状况进行优雅的处理,提高...
在Openfire的上下文中,这个计数器可能是一个独立的应用,能够连接到Openfire服务器,通过指定的用户身份(user_no和密码)登录,并实时记录接收的消息数目。 `config.ini`文件是配置文件,包含了连接到Openfire...
然而,标准的Openfire配置可能会遇到一个问题:当用户退出群聊房间后,该房间可能会被销毁,导致所有聊天记录丢失,这对于需要保留历史记录的团队来说是一个显著的不足。为了解决这个问题,"openfire群聊持久化插件...