public void completeRegistration(TransportSession session) { final IQ result = IQ.createResultIQ(session.getRegistrationPacket()); if (!session.getFailureStatus().equals(ConnectionFailureReason.NO_ISSUE)) { // Ooh there was a connection issue, we're going to report that back! if (session .getFailureStatus() .equals(ConnectionFailureReason.USERNAME_OR_PASSWORD_INCORRECT)) { result.setError(Condition.not_authorized); } else if (session.getFailureStatus().equals(ConnectionFailureReason.CAN_NOT_CONNECT)) { result.setError(Condition.service_unavailable); } else if (session.getFailureStatus().equals(ConnectionFailureReason.LOCKED_OUT)) { result.setError(Condition.forbidden); } else { result.setError(Condition.undefined_condition); } result.setType(IQ.Type.error); } parent.sendPacket(result); session.setRegistrationPacket(null); // Lets ask them what their presence is, maybe log them in immediately. final Presence p = new Presence(Presence.Type.probe); p.setTo(session.getJID()); p.setFrom(parent.getJID()); parent.sendPacket(p); }
/** * Processes an IQ-register request that is expressing the wish to deregister from a gateway. * * @param packet the IQ-register stanza. */ private void handleDeregister(final IQ packet) { final IQ result = IQ.createResultIQ(packet); if (packet.getChildElement().elements().size() != 1) { Log.debug( "Cannot process this stanza - exactly one" + " childelement of <remove> expected:" + packet.toXML()); final IQ error = IQ.createResultIQ(packet); error.setError(Condition.bad_request); parent.sendPacket(error); return; } final JID from = packet.getFrom(); final JID to = packet.getTo(); // Tell the end user the transport went byebye. final Presence unavailable = new Presence(Presence.Type.unavailable); unavailable.setTo(from); unavailable.setFrom(to); this.parent.sendPacket(unavailable); try { deleteRegistration(from); } catch (UserNotFoundException e) { Log.debug("Error cleaning up contact list of: " + from); result.setError(Condition.registration_required); } parent.sendPacket(result); }
/** * Only have to update the presence for the *service* here * * @param userJid */ void serviceOnline(JID userJid) { Presence p = new Presence(); p.setFrom(getServiceJID(userJid)); p.setTo(userJid); try { send(p); } catch (ComponentException e) { error("ComponentException: %s", e); } }
private void checkPresences() { for (JID prober : presenceMap.keySet()) { JID probee = presenceMap.get(prober); if (routingTable.hasComponentRoute(probee)) { Presence presence = new Presence(); presence.setFrom(prober); presence.setTo(probee); routingTable.routePacket(probee, presence, false); // No reason to hold onto prober reference. presenceMap.remove(prober); } } }
/** * Routes the Presence packet. * * @param packet the packet to route */ public void route(Presence packet) { if (packet == null) { throw new NullPointerException(); } // 根据发送包的jid查询建立连接的会话(session) ClientSession session = sessionManager.getSession(packet.getFrom()); // 当没有建立连接且状态为非连接状态,进行Presence包处理 if (session == null || session.getStatus() != Session.STATUS_CONNECTED) { handle(packet); } else { // 返回未授权错误 packet.setTo(session.getAddress()); packet.setFrom((JID) null); packet.setError(PacketError.Condition.not_authorized); session.process(packet); } }
private void processPresence(Element doc) { log.debug("processPresence()..."); Presence packet; try { packet = new Presence(doc, false); } catch (IllegalArgumentException e) { log.debug("Rejecting packet. JID malformed", e); Presence reply = new Presence(); reply.setID(doc.attributeValue("id")); reply.setTo(session.getAddress()); reply.getElement().addAttribute("from", doc.attributeValue("to")); reply.setError(PacketError.Condition.jid_malformed); session.process(reply); return; } if (session.getStatus() == Session.STATUS_CLOSED && packet.isAvailable()) { log.warn("Ignoring available presence packet of closed session: " + packet); return; } packet.setFrom(session.getAddress()); router.route(packet); session.incrementClientPacketCount(); if (session.getStatus() == Session.STATUS_AUTHENTICATED && packet.isAvailable()) { String userName = session.getAddress().getNode(); System.out.println("Query username : -> " + userName); if (null != userName && !"".equals(userName)) { NotificationMO mo = new NotificationMO(); mo.setUsername(userName); mo.setStatus(NotificationMO.STATUS_NOT_SEND); List<NotificationMO> list = notificationService.queryNotification(mo); if (!list.isEmpty()) { for (NotificationMO notificationMO : list) { notificationManager.sendOfflineNotification(notificationMO); } } else { log.info(" no offline notification, username = "******"userName is null !!!!!!"); } } }
protected List<Packet> processPresence(Presence pres) { JID from = pres.getFrom(); synchronized (mSessions) { InteropSession s = getSession(from.toBareJID()); if (s != null) return s.processPresence(pres); else { // is it being sent to the service? If so, then check // to see if we have a registration we need to load if (pres.getTo().getNode() == null) { try { Map<String, String> registration = Interop.getDataProvider().getIMGatewayRegistration(from, mName); if (registration != null) { String username = registration.get(InteropRegistrationProvider.USERNAME); String password = registration.get(InteropRegistrationProvider.PASSWORD); s = mFact.createSession(this, new JID(from.toBareJID()), username, password); mSessions.put(from.toBareJID(), s); return s.processPresence(pres); } } catch (IOException e) { warn( "Caught exception trying to fetch Gateway Registration from provider for " + from.toBareJID() + " svc " + mName.toString(), e); } } } } debug("Unknown session: sending unavailable reply"); Presence p = new Presence(Presence.Type.unavailable); p.setFrom(pres.getTo()); p.setTo(pres.getFrom()); List<Packet> toRet = new ArrayList<Packet>(1); toRet.add(p); return toRet; }
public void testProcessPacket_When_Packet_Send_To_Group_But_Group_No_Found() throws Exception { // Arrange final Presence packet = new Presence(); packet.setFrom(userJid); packet.setTo(groupJid); groupService.initialize(serviceJid, null); new NonStrictExpectations() { { final GroupManager groupManager = getField(groupService, "groupManager"); new NonStrictExpectations(groupManager) { { groupManager.getGroup(groupJid.getNode()); result = null; times = 1; } }; } }; new NonStrictExpectations(groupService) { { groupService.routePacket( with( new Delegate<Packet>() { public void validate(Packet packet) { assertEquals(groupJid, packet.getFrom()); assertEquals(userJid, packet.getTo()); assertEquals( PacketError.Condition.item_not_found, packet.getError().getCondition()); assertEquals(Presence.class, packet.getClass()); } })); times = 1; } }; // Act groupService.processPacket(packet); }
/** * Used when the transport loses connectivity: we update the presence state for ALL of our roster * items * * @param userId * @param p */ void serviceOffline(JID userJid) { try { Roster roster = mRosterManager.getRoster(userJid.toBareJID()); String domain = getServiceJID(userJid).getDomain(); Collection<RosterItem> items = roster.getRosterItems(); for (RosterItem item : items) { if (domain.equals(item.getJid().getDomain())) { Presence p = new Presence(Presence.Type.unavailable); p.setTo(userJid); p.setFrom(item.getJid()); try { send(p); } catch (ComponentException e) { error("ComponentException: %s", e); } } } } catch (UserNotFoundException e) { e.printStackTrace(); } }
void connectUser( JID jid, String name, String password, String transportName, String transportBuddyGroup) throws ComponentException, UserNotFoundException { synchronized (mSessions) { InteropSession s = mSessions.get(jid.toBareJID()); if (s != null) { disconnectUser(jid); } // add the SERVICE user (two-way sub) addOrUpdateRosterSubscription( jid, getServiceJID(jid), transportName, transportBuddyGroup, RosterItem.SUB_BOTH, RosterItem.ASK_NONE, RosterItem.RECV_NONE); HashMap<String, String> data = new HashMap<String, String>(); data.put(InteropRegistrationProvider.USERNAME, name); data.put(InteropRegistrationProvider.PASSWORD, password); try { Interop.getDataProvider().putIMGatewayRegistration(jid, mName, data); } catch (IOException ex) { throw new ComponentException(ex); } mSessions.put( jid.toBareJID(), mFact.createSession(this, new JID(jid.toBareJID()), name, password)); } // send a probe to the user's jid -- if the user is online, then we'll // get a presence packet which will trigger a logon Presence p = new Presence(Presence.Type.probe); p.setTo(new JID(jid.toBareJID())); p.setFrom(getServiceJID(jid)); send(p); }
public void process(Presence presence) throws PacketException { try { JID senderJID = presence.getFrom(); JID recipientJID = presence.getTo(); Presence.Type type = presence.getType(); // Reject presence subscription requests sent to the local server itself. if (recipientJID == null || recipientJID.toString().equals(serverName)) { if (type == Presence.Type.subscribe) { Presence reply = new Presence(); reply.setTo(senderJID); reply.setFrom(recipientJID); reply.setType(Presence.Type.unsubscribed); deliverer.deliver(reply); } return; } try { Roster senderRoster = getRoster(senderJID); if (senderRoster != null) { manageSub(recipientJID, true, type, senderRoster); } Roster recipientRoster = getRoster(recipientJID); boolean recipientSubChanged = false; if (recipientRoster != null) { recipientSubChanged = manageSub(senderJID, false, type, recipientRoster); } // Do not forward the packet to the recipient if the presence is of type subscribed // and the recipient user has not changed its subscription state. if (!(type == Presence.Type.subscribed && recipientRoster != null && !recipientSubChanged)) { // If the user is already subscribed to the *local* user's presence then do not // forward the subscription request. Also, do not send an auto-reply on behalf // of the user. This presence stanza is the user's server know that it MUST no // longer send notification of the subscription state change to the user. // See http://tools.ietf.org/html/rfc3921#section-7 and/or OF-38 if (type == Presence.Type.subscribe && recipientRoster != null && !recipientSubChanged) { try { RosterItem.SubType subType = recipientRoster.getRosterItem(senderJID).getSubStatus(); if (subType == RosterItem.SUB_FROM || subType == RosterItem.SUB_BOTH) { return; } } catch (UserNotFoundException e) { // Weird case: Roster item does not exist. Should never happen Log.error( "User does not exist while trying to update roster item. " + "This should never happen (this indicates a programming " + "logic error). Processing stanza: " + presence.toString(), e); } } // Try to obtain a handler for the packet based on the routes. If the handler is // a module, the module will be able to handle the packet. If the handler is a // Session the packet will be routed to the client. If a route cannot be found // then the packet will be delivered based on its recipient and sender. List<JID> jids = routingTable.getRoutes(recipientJID, null); if (!jids.isEmpty()) { for (JID jid : jids) { Presence presenteToSend = presence.createCopy(); // Stamp the presence with the user's bare JID as the 'from' address, // as required by section 8.2.5 of RFC 3921 presenteToSend.setFrom(senderJID.toBareJID()); routingTable.routePacket(jid, presenteToSend, false); } } else { deliverer.deliver(presence.createCopy()); } if (type == Presence.Type.subscribed) { // Send the presence of the local user to the remote user. The remote user // subscribed to the presence of the local user and the local user accepted JID prober = localServer.isLocal(recipientJID) ? new JID(recipientJID.toBareJID()) : recipientJID; presenceManager.probePresence(prober, senderJID); PresenceEventDispatcher.subscribedToPresence(recipientJID, senderJID); } } if (type == Presence.Type.unsubscribed) { // Send unavailable presence from all of the local user's available resources // to the remote user presenceManager.sendUnavailableFromSessions(recipientJID, senderJID); PresenceEventDispatcher.unsubscribedToPresence(senderJID, recipientJID); } } catch (SharedGroupException e) { Presence result = presence.createCopy(); JID sender = result.getFrom(); result.setFrom(presence.getTo()); result.setTo(sender); result.setError(PacketError.Condition.not_acceptable); deliverer.deliver(result); } } catch (Exception e) { Log.error(LocaleUtils.getLocalizedString("admin.error"), e); } }
protected void handleSnacResponse(SnacResponseEvent e) { super.handleSnacResponse(e); Log.debug("OSCAR bos snac response received: " + e); SnacCommand cmd = e.getSnacCommand(); if (cmd instanceof LocRightsCmd) { request(new SetInfoCmd(new InfoData("oscargateway", null, MY_CAPS, null))); request(new MyInfoRequest()); } else if (cmd instanceof ParamInfoCmd) { ParamInfoCmd pic = (ParamInfoCmd) cmd; ParamInfo info = pic.getParamInfo(); request( new SetParamInfoCmd( new ParamInfo( 0, info.getFlags() | ParamInfo.FLAG_TYPING_NOTIFICATION, 8000, info.getMaxSenderWarning(), info.getMaxReceiverWarning(), 0))); } else if (cmd instanceof ServiceRedirect) { ServiceRedirect sr = (ServiceRedirect) cmd; oscarSession.connectToService(sr.getSnacFamily(), sr.getRedirectHost(), sr.getCookie()); } else if (cmd instanceof SsiDataCmd) { SsiDataCmd sdc = (SsiDataCmd) cmd; List<SsiItem> items = sdc.getItems(); for (SsiItem item : items) { SsiItemObj obj = itemFactory.getItemObj(item); if (obj instanceof BuddyItem) { Log.debug("AIM got buddy item " + obj); oscarSession.gotBuddy((BuddyItem) obj); } else if (obj instanceof GroupItem) { Log.debug("AIM got group item " + obj); oscarSession.gotGroup((GroupItem) obj); } } if (sdc.getLastModDate() != 0) { request(new ActivateSsiCmd()); clientReady(); Presence p = new Presence(); p.setTo(oscarSession.getJID()); p.setFrom(oscarSession.getTransport().getJID()); oscarSession.getTransport().sendPacket(p); oscarSession.setLoginStatus(TransportLoginStatus.LOGGED_IN); oscarSession.gotCompleteSSI(); } } else if (cmd instanceof OfflineMsgIcqCmd) { OfflineMsgIcqCmd omic = (OfflineMsgIcqCmd) cmd; String sn = String.valueOf(omic.getFromUIN()); // String msg = "Offline message sent at "+new // Date(omic.getDate().getTime()).toString()+"\n"+OscarTools.stripHtml(omic.getContents()).trim(); String msg = "Offline message received:\n" + StringUtils.unescapeFromXML(OscarTools.stripHtml(omic.getContents()).trim()); EncodedStringInfo encmsg = MinimalEncoder.encodeMinimally(msg); InstantMessage imsg = new InstantMessage( encmsg.getImEncoding().getCharsetCode(), ByteBlock.wrap(encmsg.getData())); oscarSession .getTransport() .sendMessage( oscarSession.getJIDWithHighestPriority(), oscarSession.getTransport().convertIDToJID(sn), imsg.getMessage()); } else if (cmd instanceof OfflineMsgDoneCmd) { request(new OfflineMsgIcqAckCmd(oscarSession.getUIN(), (int) oscarSession.nextIcqId())); } else if (cmd instanceof MetaShortInfoCmd) { // MetaShortInfoCmd msic = (MetaShortInfoCmd)cmd; // Log.debug("RECEIVED META SHORT INFO: "+msic); // oscarSession.updateRosterNickname(String.valueOf(msic.getUIN()), // msic.getNickname()); } else if (cmd instanceof BuddyAddedYouCmd) { BuddyAddedYouCmd bay = (BuddyAddedYouCmd) cmd; Presence p = new Presence(); p.setType(Presence.Type.subscribe); p.setTo(oscarSession.getJID()); p.setFrom(oscarSession.getTransport().convertIDToJID(bay.getUin())); oscarSession.getTransport().sendPacket(p); } else if (cmd instanceof BuddyAuthRequest) { BuddyAuthRequest bar = (BuddyAuthRequest) cmd; Presence p = new Presence(); p.setType(Presence.Type.subscribe); p.setTo(oscarSession.getJID()); p.setFrom(oscarSession.getTransport().convertIDToJID(bar.getScreenname())); oscarSession.getTransport().sendPacket(p); } else if (cmd instanceof AuthReplyCmd) { AuthReplyCmd ar = (AuthReplyCmd) cmd; if (ar.isAccepted()) { Presence p = new Presence(); p.setType(Presence.Type.subscribed); p.setTo(oscarSession.getJID()); p.setFrom(oscarSession.getTransport().convertIDToJID(ar.getSender())); oscarSession.getTransport().sendPacket(p); } else { Presence p = new Presence(); p.setType(Presence.Type.unsubscribed); p.setTo(oscarSession.getJID()); p.setFrom(oscarSession.getTransport().convertIDToJID(ar.getSender())); oscarSession.getTransport().sendPacket(p); } } else if (cmd instanceof AuthFutureCmd) { AuthFutureCmd af = (AuthFutureCmd) cmd; Presence p = new Presence(); p.setType(Presence.Type.subscribe); p.setTo(oscarSession.getJID()); p.setFrom(oscarSession.getTransport().convertIDToJID(af.getUin())); oscarSession.getTransport().sendPacket(p); } }