authRequest *SpectrumRosterManager::handleAuthorizationRequest(PurpleAccount *account, const char *remote_user, const char *id, const char *alias, const char *message, gboolean on_list, PurpleAccountRequestAuthorizationCb authorize_cb, PurpleAccountRequestAuthorizationCb deny_cb, void *user_data) { std::string name(remote_user); authRequest *req = new authRequest; req->authorize_cb = authorize_cb; req->deny_cb = deny_cb; req->user_data = user_data; req->account = m_user->account(); req->who = name; req->mainJID = m_user->jid(); m_authRequests[name] = req; Log(m_user->jid(), "purpleAuthorizeReceived: " << name << "on_list:" << on_list); // std::for_each( name.begin(), name.end(), replaceBadJidCharacters() ); if (Transport::instance()->getConfiguration().jid_escaping) { name = JID::escapeNode(name); } else { std::for_each( name.begin(), name.end(), replaceBadJidCharacters() ); } // send subscribe presence to user Tag *tag = new Tag("presence"); tag->addAttribute("type", "subscribe" ); tag->addAttribute("from", name + "@" + Transport::instance()->jid()); tag->addAttribute("to", m_user->jid()); if (alias) { Tag *nick = new Tag("nick", std::string(alias)); nick->addAttribute("xmlns","http://jabber.org/protocol/nick"); tag->addChild(nick); } Transport::instance()->send(tag); return req; }
void IRCProtocol::makeRoomJID(User *user, std::string &name) { // #pidgin" -> "#pidgin%[email protected]" std::transform(name.begin(), name.end(), name.begin(),(int(*)(int)) std::tolower); std::string name_safe = name; std::for_each( name_safe.begin(), name_safe.end(), replaceBadJidCharacters() ); // OK name.assign(name_safe + "%" + JID(user->username()).server() + "@" + Transport::instance()->jid()); std::cout << "ROOMJID: " << name << "\n"; }
void SpectrumRosterManager::sendPresence(const std::string &name, const std::string &resource) { AbstractSpectrumBuddy *s_buddy = getRosterItem(name); if (s_buddy) { sendPresence(s_buddy, resource); } else { std::string n(name); std::for_each( n.begin(), n.end(), replaceBadJidCharacters() ); // THIS ONE IS RIGHT Log(m_user->jid(), "answering to probe presence with unavailable presence"); Tag *tag = new Tag("presence"); tag->addAttribute("to", m_user->jid() + std::string(resource.empty() ? "" : "/" + resource)); tag->addAttribute("from", n + "@" + Transport::instance()->jid()); tag->addAttribute("type", "unavailable"); Transport::instance()->send(tag); } }
void SpectrumConversation::handleMessage(AbstractUser *user, const char *who, const char *msg, PurpleMessageFlags flags, time_t mtime, const std::string ¤tBody) { std::string name(who); // Remove resource if it's XMPP JID size_t pos = name.find("/"); if (pos != std::string::npos) name.erase((int) pos, name.length() - (int) pos); AbstractSpectrumBuddy *s_buddy = NULL; #ifndef TESTS User *u = (User *) user; s_buddy = u->getRosterItem(name); #endif if (s_buddy && s_buddy->getFlags() & SPECTRUM_BUDDY_JID_ESCAPING) name = JID::escapeNode(name); else if (s_buddy) std::for_each( name.begin(), name.end(), replaceBadJidCharacters() ); // OK else if (m_room.empty()) name = JID::escapeNode(name); // Escape HTML characters. char *newline = purple_strdup_withhtml(msg); char *strip, *xhtml, *xhtml_linkified; purple_markup_html_to_xhtml(newline, &xhtml, &strip); xhtml_linkified = purple_markup_linkify(xhtml); std::string message(strip); std::string m(xhtml_linkified); g_free(newline); g_free(xhtml); g_free(xhtml_linkified); g_free(strip); std::string to; if (getResource().empty()) to = user->jid(); else to = user->jid() + "/" + getResource(); if (flags & PURPLE_MESSAGE_ERROR) { Message s(Message::Error, to, currentBody); if (!m_room.empty()) s.setFrom(m_room + "/" + name); else { std::transform(name.begin(), name.end(), name.begin(),(int(*)(int)) std::tolower); s.setFrom(name + std::string(getType() == SPECTRUM_CONV_CHAT ? "" : ("%" + JID(user->username()).server())) + "@" + Transport::instance()->jid() + "/bot"); } Error *c = new Error(StanzaErrorTypeModify, StanzaErrorNotAcceptable); c->setText(tr(user->getLang(), message)); s.addExtension(c); Transport::instance()->send(s.tag()); return; } Message s(Message::Chat, to, message); if (!m_room.empty()) s.setFrom(m_room + "/" + name); else { std::transform(name.begin(), name.end(), name.begin(),(int(*)(int)) std::tolower); s.setFrom(name + std::string(getType() == SPECTRUM_CONV_CHAT ? "" : ("%" + JID(user->username()).server())) + "@" + Transport::instance()->jid() + "/bot"); } // chatstates if (purple_value_get_boolean(user->getSetting("enable_chatstate"))) { if (user->hasFeature(GLOOX_FEATURE_CHATSTATES, getResource())) { ChatState *c = new ChatState(ChatStateActive); s.addExtension(c); } } // Delayed messages, we have to count with some delay if (mtime && (unsigned long) time(NULL)-10 > (unsigned long) mtime/* && (unsigned long) time(NULL) - 31536000 < (unsigned long) mtime*/) { char buf[80]; strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%SZ", gmtime(&mtime)); std::string timestamp(buf); DelayedDelivery *d = new DelayedDelivery(name + "@" + Transport::instance()->jid() + "/bot", timestamp); s.addExtension(d); } Tag *stanzaTag = s.tag(); std::string res = getResource(); if (user->hasFeature(GLOOX_FEATURE_XHTML_IM, res) && m != message) { if (m.find("<body") != 0) { m = "<body>" + m + "</body>"; } Transport::instance()->parser()->getTag(m, sendXhtmlTag, stanzaTag); return; } Transport::instance()->send(stanzaTag); }