/** * Adds the new user to others roster. * * @param newUser the new user * @param otherItem the other item * @param currentUser the current user * @throws ServiceException the service exception */ private static void addNewUserToOthersRoster( User newUser, RosterItem otherItem, String currentUser) throws ServiceException { otherItem.getJid(); UserManager userManager = UserManager.getInstance(); // Is this user registered with our OF server? String username = otherItem.getJid().getNode(); if (username != null && username.length() > 0 && userManager.isRegisteredUser(username) && XMPPServer.getInstance() .isLocal(XMPPServer.getInstance().createJID(currentUser, null))) { try { User otherUser = userManager.getUser(username); Roster otherRoster = otherUser.getRoster(); RosterItem oldUserOnOthersRoster = otherRoster.getRosterItem(XMPPServer.getInstance().createJID(currentUser, null)); try { if (!oldUserOnOthersRoster.isOnlyShared()) { RosterItem justCreated = otherRoster.createRosterItem( XMPPServer.getInstance().createJID(newUser.getUsername(), null), oldUserOnOthersRoster.getNickname(), oldUserOnOthersRoster.getGroups(), true, true); justCreated.setAskStatus(oldUserOnOthersRoster.getAskStatus()); justCreated.setRecvStatus(oldUserOnOthersRoster.getRecvStatus()); justCreated.setSubStatus(oldUserOnOthersRoster.getSubStatus()); otherRoster.updateRosterItem(justCreated); } } catch (UserAlreadyExistsException e) { throw new ServiceException( "Could not create roster item for user ", newUser.getUsername(), ExceptionType.USER_ALREADY_EXISTS_EXCEPTION, Response.Status.CONFLICT, e); } catch (SharedGroupException e) { throw new ServiceException( "Could not create roster item, because it is a contact from a shared group", newUser.getUsername(), ExceptionType.USER_ALREADY_EXISTS_EXCEPTION, Response.Status.BAD_REQUEST, e); } } catch (UserNotFoundException e) { throw new ServiceException( "Could not create roster item for user " + newUser.getUsername() + " because it is a contact from a shared group.", newUser.getUsername(), ExceptionType.USER_NOT_FOUND_EXCEPTION, Response.Status.NOT_FOUND, e); } } }
/** * Remove a roster item. At this stage, this is recipient who has received a roster update. We * must check that it is a removal, and if so, remove the roster item based on the sender's id * rather than what is in the item listing itself. * * @param packet The packet suspected of containing a roster removal */ private void removeRosterItem(org.xmpp.packet.Roster packet) throws UnauthorizedException, SharedGroupException { JID recipientJID = packet.getTo(); JID senderJID = packet.getFrom(); try { for (org.xmpp.packet.Roster.Item packetItem : packet.getItems()) { if (packetItem.getSubscription() == org.xmpp.packet.Roster.Subscription.remove) { Roster roster = userManager.getUser(recipientJID.getNode()).getRoster(); RosterItem item = roster.getRosterItem(senderJID); roster.deleteRosterItem(senderJID, true); item.setSubStatus(RosterItem.SUB_REMOVE); item.setSubStatus(RosterItem.SUB_NONE); Packet itemPacket = packet.createCopy(); sessionManager.userBroadcast(recipientJID.getNode(), itemPacket); } } } catch (UserNotFoundException e) { throw new UnauthorizedException(e); } }
/** * Copy roster. * * @param currentUser the current user * @param newUser the new user * @param currentUserName the current user name * @throws ServiceException the service exception */ private static void copyRoster(User currentUser, User newUser, String currentUserName) throws ServiceException { Roster newRoster = newUser.getRoster(); Roster currentRoster = currentUser.getRoster(); for (RosterItem item : currentRoster.getRosterItems()) { try { List<String> groups = item.getGroups(); RosterItem justCreated = newRoster.createRosterItem(item.getJid(), item.getNickname(), groups, true, true); justCreated.setAskStatus(item.getAskStatus()); justCreated.setRecvStatus(item.getRecvStatus()); justCreated.setSubStatus(item.getSubStatus()); for (Group gr : item.getSharedGroups()) { justCreated.addSharedGroup(gr); } for (Group gr : item.getInvisibleSharedGroups()) { justCreated.addInvisibleSharedGroup(gr); } newRoster.updateRosterItem(justCreated); addNewUserToOthersRoster(newUser, item, currentUserName); } catch (UserAlreadyExistsException e) { throw new ServiceException( "Could not create roster item for user ", newUser.getUsername(), ExceptionType.USER_ALREADY_EXISTS_EXCEPTION, Response.Status.CONFLICT, e); } catch (SharedGroupException e) { throw new ServiceException( "Could not create roster item, because it is a contact from a shared group", newUser.getUsername(), ExceptionType.USER_ALREADY_EXISTS_EXCEPTION, Response.Status.BAD_REQUEST, e); } catch (UserNotFoundException e) { throw new ServiceException( "Could not update roster item for user " + newUser.getUsername() + " because it was not properly created.", newUser.getUsername(), ExceptionType.USER_NOT_FOUND_EXCEPTION, Response.Status.NOT_FOUND, e); } } }
/** * Determine and call the update method based on the item's subscription state. The method also * turns the action and sending status into an integer code for easier processing (switch * statements). * * <p>Code relies on states being in numerical order without skipping. In addition, the receive * states must parallel the send states so that (send state X) + STATE_RECV_SUBSCRIBE == (receive * state X) where X is subscribe, subscribed, etc. * * @param item The item to be updated * @param action The new state change request * @param isSending True if the roster owner of the item is sending the new state change request */ private static void updateState(RosterItem item, Presence.Type action, boolean isSending) { Map<String, Map<Presence.Type, Change>> srTable = stateTable.get(item.getSubStatus()); Map<Presence.Type, Change> changeTable = srTable.get(isSending ? "send" : "recv"); Change change = changeTable.get(action); if (change.newAsk != null && change.newAsk != item.getAskStatus()) { item.setAskStatus(change.newAsk); } if (change.newSub != null && change.newSub != item.getSubStatus()) { item.setSubStatus(change.newSub); } if (change.newRecv != null && change.newRecv != item.getRecvStatus()) { item.setRecvStatus(change.newRecv); } }
public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { JspFactory _jspxFactory = null; PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; JspWriter _jspx_out = null; PageContext _jspx_page_context = null; try { _jspxFactory = JspFactory.getDefaultFactory(); response.setContentType("text/html"); pageContext = _jspxFactory.getPageContext(this, request, response, "error.jsp", true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; out.write("\n\n\n\n\n\n\n\n\n\n\n\n"); org.jivesoftware.util.WebManager webManager = null; synchronized (_jspx_page_context) { webManager = (org.jivesoftware.util.WebManager) _jspx_page_context.getAttribute("webManager", PageContext.PAGE_SCOPE); if (webManager == null) { webManager = new org.jivesoftware.util.WebManager(); _jspx_page_context.setAttribute("webManager", webManager, PageContext.PAGE_SCOPE); } } out.write('\n'); out.write('\n'); // Get parameters boolean cancel = request.getParameter("cancel") != null; String username = ParamUtils.getParameter(request, "username"); String jid = ParamUtils.getParameter(request, "jid"); String nickname = ParamUtils.getParameter(request, "nickname"); String groups = ParamUtils.getParameter(request, "groups"); Integer sub = ParamUtils.getIntParameter(request, "sub", 0); boolean save = ParamUtils.getBooleanParameter(request, "save"); // Handle a cancel if (cancel) { response.sendRedirect("user-roster.jsp?username="******"UTF-8")); return; } // Load the user's roster object Roster roster = webManager.getRosterManager().getRoster(username); // Load the roster item from the user's roster. RosterItem item = roster.getRosterItem(new JID(jid)); // Handle a roster item delete: if (save) { List<String> groupList = new ArrayList<String>(); if (groups != null) { for (String group : groups.split(",")) { groupList.add(group.trim()); } } item.setNickname(nickname); item.setGroups(groupList); item.setSubStatus(RosterItem.SubType.getTypeFromInt(sub)); // Delete the roster item roster.updateRosterItem(item); // Log the event webManager.logEvent("deleted roster item from " + username, "roster item:\njid = " + jid); // Done, so redirect response.sendRedirect( "user-roster.jsp?username="******"UTF-8") + "&editsuccess=true"); return; } out.write("\n\n<html>\n <head>\n <title>"); if (_jspx_meth_fmt_message_0(_jspx_page_context)) return; out.write( "</title>\n <meta name=\"subPageID\" content=\"user-roster\"/>\n <meta name=\"extraParams\" content=\""); out.print("username="******"UTF-8")); out.write("\"/>\n </head>\n <body>\n\n<p>\n"); // fmt:message org.apache.taglibs.standard.tag.rt.fmt.MessageTag _jspx_th_fmt_message_1 = (org.apache.taglibs.standard.tag.rt.fmt.MessageTag) _jspx_tagPool_fmt_message_key.get( org.apache.taglibs.standard.tag.rt.fmt.MessageTag.class); _jspx_th_fmt_message_1.setPageContext(_jspx_page_context); _jspx_th_fmt_message_1.setParent(null); _jspx_th_fmt_message_1.setKey("user.roster.edit.info"); int _jspx_eval_fmt_message_1 = _jspx_th_fmt_message_1.doStartTag(); if (_jspx_eval_fmt_message_1 != javax.servlet.jsp.tagext.Tag.SKIP_BODY) { if (_jspx_eval_fmt_message_1 != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) { out = _jspx_page_context.pushBody(); _jspx_th_fmt_message_1.setBodyContent((javax.servlet.jsp.tagext.BodyContent) out); _jspx_th_fmt_message_1.doInitBody(); } do { out.write("\n "); // fmt:param org.apache.taglibs.standard.tag.rt.fmt.ParamTag _jspx_th_fmt_param_0 = (org.apache.taglibs.standard.tag.rt.fmt.ParamTag) _jspx_tagPool_fmt_param_value_nobody.get( org.apache.taglibs.standard.tag.rt.fmt.ParamTag.class); _jspx_th_fmt_param_0.setPageContext(_jspx_page_context); _jspx_th_fmt_param_0.setParent((javax.servlet.jsp.tagext.Tag) _jspx_th_fmt_message_1); _jspx_th_fmt_param_0.setValue(StringUtils.escapeForXML(username)); int _jspx_eval_fmt_param_0 = _jspx_th_fmt_param_0.doStartTag(); if (_jspx_th_fmt_param_0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) { _jspx_tagPool_fmt_param_value_nobody.reuse(_jspx_th_fmt_param_0); return; } _jspx_tagPool_fmt_param_value_nobody.reuse(_jspx_th_fmt_param_0); out.write('\n'); int evalDoAfterBody = _jspx_th_fmt_message_1.doAfterBody(); if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN) break; } while (true); if (_jspx_eval_fmt_message_1 != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) out = _jspx_page_context.popBody(); } if (_jspx_th_fmt_message_1.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) { _jspx_tagPool_fmt_message_key.reuse(_jspx_th_fmt_message_1); return; } _jspx_tagPool_fmt_message_key.reuse(_jspx_th_fmt_message_1); out.write("\n</p>\n\n<fieldset>\n <legend>"); if (_jspx_meth_fmt_message_2(_jspx_page_context)) return; out.write( "</legend>\n <div>\n <table cellpadding=\"3\" cellspacing=\"0\" border=\"0\" width=\"100%\">\n <tbody>\n <tr>\n <td class=\"c1\">\n "); if (_jspx_meth_fmt_message_3(_jspx_page_context)) return; out.write(":\n </td>\n <td>\n "); out.print(StringUtils.escapeHTMLTags(jid)); out.write( "\n </td>\n </tr>\n <tr>\n <td class=\"c1\">\n "); if (_jspx_meth_fmt_message_4(_jspx_page_context)) return; out.write(":\n </td>\n <td>\n "); out.print(StringUtils.escapeHTMLTags(item.getNickname())); out.write( "\n </td>\n </tr>\n <tr>\n <td class=\"c1\">\n "); if (_jspx_meth_fmt_message_5(_jspx_page_context)) return; out.write(":\n </td>\n <td>\n "); List<String> groupList = item.getGroups(); if (!groupList.isEmpty()) { int count = 0; for (String group : groupList) { if (count != 0) { out.print(","); } out.print(StringUtils.escapeForXML(group)); count++; } } else { out.print("<i>None</i>"); } out.write( "\n </td>\n </tr>\n <tr>\n <td class=\"c1\">\n <a href=\"group-summary.jsp\">"); if (_jspx_meth_fmt_message_6(_jspx_page_context)) return; out.write("</a>:\n </td>\n <td>\n "); Collection<Group> sharedGroups = item.getSharedGroups(); if (!sharedGroups.isEmpty()) { int count = 0; for (Group group : sharedGroups) { if (count != 0) { out.print(","); } out.print( "<a href='group-edit.jsp?group=" + URLEncoder.encode(group.getName(), "UTF-8") + "'>"); out.print(StringUtils.escapeForXML(group.getName())); out.print("</a>"); count++; } } else { out.print("<i>None</i>"); } out.write( "\n </td>\n </tr>\n <tr>\n <td class=\"c1\">\n "); if (_jspx_meth_fmt_message_7(_jspx_page_context)) return; out.write(":\n </td>\n <td>\n "); out.print(StringUtils.escapeHTMLTags(item.getSubStatus().getName())); out.write( "\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n</fieldset>\n\n<br><br>\n\n<form style=\"display: inline\" action=\"user-roster-edit.jsp\">\n<input type=\"hidden\" name=\"jid\" value=\""); out.print(StringUtils.escapeForXML(jid)); out.write("\">\n<input type=\"hidden\" name=\"username\" value=\""); out.print(StringUtils.escapeForXML(username)); out.write("\">\n<input type=\"submit\" value=\""); if (_jspx_meth_fmt_message_8(_jspx_page_context)) return; out.write("\">\n</form>\n\n"); if (sharedGroups.isEmpty()) { out.write( "\n<form style=\"display: inline\" action=\"user-roster-delete.jsp\">\n<input type=\"hidden\" name=\"jid\" value=\""); out.print(StringUtils.escapeForXML(jid)); out.write("\">\n<input type=\"hidden\" name=\"username\" value=\""); out.print(StringUtils.escapeForXML(username)); out.write("\">\n<input type=\"submit\" value=\""); if (_jspx_meth_fmt_message_9(_jspx_page_context)) return; out.write("\">\n</form>\n"); } out.write("\n\n </body>\n</html>\n"); } catch (Throwable t) { if (!(t instanceof SkipPageException)) { out = _jspx_out; if (out != null && out.getBufferSize() != 0) out.clearBuffer(); if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); } } finally { if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context); } }