2019-08-17 02:12:19 +02:00
|
|
|
/* Copyright (C) 2019 Wildfire Games.
|
2013-11-07 21:07:24 +01:00
|
|
|
* This file is part of 0 A.D.
|
|
|
|
*
|
|
|
|
* 0 A.D. is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* 0 A.D. is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef XXXMPPCLIENT_H
|
|
|
|
#define XXXMPPCLIENT_H
|
|
|
|
|
|
|
|
#include "IXmppClient.h"
|
2013-12-28 04:34:40 +01:00
|
|
|
|
2013-11-07 21:07:24 +01:00
|
|
|
#include <deque>
|
2015-09-10 07:30:18 +02:00
|
|
|
|
|
|
|
#include "glooxwrapper/glooxwrapper.h"
|
2013-11-07 21:07:24 +01:00
|
|
|
#include "scriptinterface/ScriptVal.h"
|
|
|
|
|
|
|
|
class ScriptInterface;
|
|
|
|
|
|
|
|
namespace glooxwrapper
|
|
|
|
{
|
|
|
|
class Client;
|
|
|
|
struct CertInfo;
|
|
|
|
}
|
|
|
|
|
STUN + XMPP ICE implementation.
Allows lobby players to host games without having to configure their
router.
Differential Revision: https://code.wildfiregames.com/D364
Fixes #2305
Patch By: fcxSanya.
StunClient based on code by SuperTuxKart, relicensed with approval of
the according authors hilnius, hiker, Auria, deveee, Flakebi, leper,
konstin and KroArtem.
Added rfc5245 (ejabberd) support, a GUI option, refactoring and segfault
fixes by myself.
Tested By: user1, Sandarac, Sestroretsk1714, Vladislav, Grugnas,
javiergodas
Partially Reviewed By: leper, Philip, echotangoecho
This was SVN commit r19703.
2017-06-01 08:33:52 +02:00
|
|
|
class XmppClient : public IXmppClient, public glooxwrapper::ConnectionListener, public glooxwrapper::MUCRoomHandler, public glooxwrapper::IqHandler, public glooxwrapper::RegistrationHandler, public glooxwrapper::MessageHandler, public glooxwrapper::Jingle::SessionHandler
|
2013-11-07 21:07:24 +01:00
|
|
|
{
|
|
|
|
NONCOPYABLE(XmppClient);
|
2015-09-10 07:30:18 +02:00
|
|
|
|
2013-11-07 21:07:24 +01:00
|
|
|
private:
|
2015-09-15 02:55:03 +02:00
|
|
|
// Components
|
2013-11-07 21:07:24 +01:00
|
|
|
glooxwrapper::Client* m_client;
|
|
|
|
glooxwrapper::MUCRoom* m_mucRoom;
|
|
|
|
glooxwrapper::Registration* m_registration;
|
STUN + XMPP ICE implementation.
Allows lobby players to host games without having to configure their
router.
Differential Revision: https://code.wildfiregames.com/D364
Fixes #2305
Patch By: fcxSanya.
StunClient based on code by SuperTuxKart, relicensed with approval of
the according authors hilnius, hiker, Auria, deveee, Flakebi, leper,
konstin and KroArtem.
Added rfc5245 (ejabberd) support, a GUI option, refactoring and segfault
fixes by myself.
Tested By: user1, Sandarac, Sestroretsk1714, Vladislav, Grugnas,
javiergodas
Partially Reviewed By: leper, Philip, echotangoecho
This was SVN commit r19703.
2017-06-01 08:33:52 +02:00
|
|
|
glooxwrapper::SessionManager* m_sessionManager;
|
2015-09-10 07:30:18 +02:00
|
|
|
|
2015-09-15 02:55:03 +02:00
|
|
|
// Account infos
|
2013-11-07 21:07:24 +01:00
|
|
|
std::string m_username;
|
|
|
|
std::string m_password;
|
2018-03-12 01:23:40 +01:00
|
|
|
std::string m_server;
|
|
|
|
std::string m_room;
|
2013-11-07 21:07:24 +01:00
|
|
|
std::string m_nick;
|
|
|
|
std::string m_xpartamuppId;
|
2018-04-14 14:50:54 +02:00
|
|
|
std::string m_echelonId;
|
2015-09-10 07:30:18 +02:00
|
|
|
|
2015-08-30 14:56:48 +02:00
|
|
|
// State
|
2018-10-09 19:50:08 +02:00
|
|
|
gloox::CertStatus m_certStatus;
|
2015-09-15 02:55:03 +02:00
|
|
|
bool m_initialLoadComplete;
|
2018-01-15 05:30:33 +01:00
|
|
|
bool m_isConnected;
|
2015-09-10 07:30:18 +02:00
|
|
|
|
2013-11-07 21:07:24 +01:00
|
|
|
public:
|
2015-09-15 02:55:03 +02:00
|
|
|
// Basic
|
2019-09-06 07:14:20 +02:00
|
|
|
XmppClient(const ScriptInterface* scriptInterface, const std::string& sUsername, const std::string& sPassword, const std::string& sRoom, const std::string& sNick, const int historyRequestSize = 0, const bool regOpt = false);
|
2013-11-07 21:07:24 +01:00
|
|
|
virtual ~XmppClient();
|
|
|
|
|
2019-09-06 07:14:20 +02:00
|
|
|
// JS::Heap is better for GC performance than JS::PersistentRooted
|
|
|
|
static void Trace(JSTracer *trc, void *data)
|
|
|
|
{
|
|
|
|
static_cast<XmppClient*>(data)->TraceMember(trc);
|
|
|
|
}
|
|
|
|
|
|
|
|
void TraceMember(JSTracer *trc);
|
|
|
|
|
2015-09-15 02:55:03 +02:00
|
|
|
// Network
|
2013-11-07 21:07:24 +01:00
|
|
|
void connect();
|
|
|
|
void disconnect();
|
2018-01-15 05:30:33 +01:00
|
|
|
bool isConnected();
|
2013-11-07 21:07:24 +01:00
|
|
|
void recv();
|
|
|
|
void SendIqGetBoardList();
|
2014-09-20 17:35:26 +02:00
|
|
|
void SendIqGetProfile(const std::string& player);
|
2017-08-24 02:32:42 +02:00
|
|
|
void SendIqGameReport(const ScriptInterface& scriptInterface, JS::HandleValue data);
|
|
|
|
void SendIqRegisterGame(const ScriptInterface& scriptInterface, JS::HandleValue data);
|
2013-11-07 21:07:24 +01:00
|
|
|
void SendIqUnregisterGame();
|
|
|
|
void SendIqChangeStateGame(const std::string& nbp, const std::string& players);
|
2018-03-12 01:23:40 +01:00
|
|
|
void SendIqLobbyAuth(const std::string& to, const std::string& token);
|
2013-11-07 21:07:24 +01:00
|
|
|
void SetNick(const std::string& nick);
|
|
|
|
void GetNick(std::string& nick);
|
|
|
|
void kick(const std::string& nick, const std::string& reason);
|
|
|
|
void ban(const std::string& nick, const std::string& reason);
|
|
|
|
void SetPresence(const std::string& presence);
|
2019-09-12 19:23:33 +02:00
|
|
|
const char* GetPresence(const std::string& nickname);
|
|
|
|
const char* GetRole(const std::string& nickname);
|
Rewrite lobby page to use class semantics, add more gamedetails labels, improve performance using batch processing and caching and gain possibility for game creation/player-join/leave events, refs #5387.
Game selection details features:
* Display victory conditions following their sending but missing display
following bffe917914, refs 7b0f6f530c.
* Display the host of the match and the game name in the selected game
details following 61261d14fc, refs D1666.
* Display mods if the mods differ (without having to attempt to join the
game prior) following eca956a513.
Performance features:
* Implement batch message processing in the XmppClient to rebuild GUI
objects only once when receiving backlog or returning from a match.
* Implement Game class to cache gamelist, filter and sorting values, as
they rarely change but are accessed often.
* Cache sprintf objects.
Security fixes:
* Add escapeText in lobby/ to avoid players breaking the lobby for every
participant, supersedes D720, comments by bb.
* Do not hide broadcasted unrecognized chat commands that mods used as
leaking private channels, fixes #5615.
Defect fixes:
* Fix XmppClient.cpp storing unused historic message types resulting in
memory waste and unintentional replay of for instance
disconnect/announcements messages following both e8dfde9ba6/D819 and
6bf74902a7/D2265, refs #3306.
* Fix XmppClient.cpp victoryCondition -> victoryConditions gamesetup.js
change from 6d54ab4c1f/D1240.
* Fix leaderboard/profile page cancel hotkey closing the lobby dialog as
well and removes cancel hotkey note from lobby_panels.xml from
960f2d7c31/D817 since the described issue was fixed by f9b529f2fb/D1701.
* Fix lobby playing menu sound in a running game after having closed the
lobby dialog following introduction in 960f2d7c31/D817.
* Fix GUI on nick change by updating g_Username.
* Update profile panel only with data matching the player requested.
Hack erasure:
* Object semantics make it cheap to add state and cache values, storing
literals in properties while removing globals, adding events while
decoupling components and gaining moddability.
* Erase comments and translation comments stating that this would be
IRC!!, supersedes D1136.
* Introduce Status chat message type to supersede "/special" chat
command + "isSpecial" property from bffe917914 (formerly g_specialKey
e6840f5fca) deluxe hack.
* Introduce System chat message type to supersede system errors
disguising as chat from a mock user called "system".
Code cleanups:
* Move code from XML to JS.
* Move size values from JS to XML, especially following 960f2d7c31/D817
and 7752219cef/D1051.
* Rename "user" to "player".
* Fix lobby/ eslint warnings, refs D2261.
* Remove message.nick emptiness check from 0940db3fc0/D835, since
XEP-0045 dictates that it is non-empty.
* Add translated string for deleted subjects.
* Add TODOs for some evident COList issues, refs #5638.
Differential Revision: https://code.wildfiregames.com/D2412
This was SVN commit r23172.
2019-11-21 14:44:41 +01:00
|
|
|
std::wstring GetRating(const std::string& nickname);
|
2019-09-12 19:23:33 +02:00
|
|
|
const std::wstring& GetSubject();
|
2013-11-07 21:07:24 +01:00
|
|
|
|
2017-08-24 02:32:42 +02:00
|
|
|
void GUIGetPlayerList(const ScriptInterface& scriptInterface, JS::MutableHandleValue ret);
|
|
|
|
void GUIGetGameList(const ScriptInterface& scriptInterface, JS::MutableHandleValue ret);
|
|
|
|
void GUIGetBoardList(const ScriptInterface& scriptInterface, JS::MutableHandleValue ret);
|
|
|
|
void GUIGetProfile(const ScriptInterface& scriptInterface, JS::MutableHandleValue ret);
|
2015-09-10 07:30:18 +02:00
|
|
|
|
2019-08-17 02:12:19 +02:00
|
|
|
void SendStunEndpointToHost(const StunClient::StunEndpoint& stunEndpoint, const std::string& hostJID);
|
STUN + XMPP ICE implementation.
Allows lobby players to host games without having to configure their
router.
Differential Revision: https://code.wildfiregames.com/D364
Fixes #2305
Patch By: fcxSanya.
StunClient based on code by SuperTuxKart, relicensed with approval of
the according authors hilnius, hiker, Auria, deveee, Flakebi, leper,
konstin and KroArtem.
Added rfc5245 (ejabberd) support, a GUI option, refactoring and segfault
fixes by myself.
Tested By: user1, Sandarac, Sestroretsk1714, Vladislav, Grugnas,
javiergodas
Partially Reviewed By: leper, Philip, echotangoecho
This was SVN commit r19703.
2017-06-01 08:33:52 +02:00
|
|
|
|
2019-09-12 19:23:33 +02:00
|
|
|
/**
|
|
|
|
* Convert gloox values to string or time.
|
|
|
|
*/
|
|
|
|
static const char* GetPresenceString(const gloox::Presence::PresenceType presenceType);
|
|
|
|
static const char* GetRoleString(const gloox::MUCRoomRole role);
|
|
|
|
static std::string StanzaErrorToString(gloox::StanzaError err);
|
|
|
|
static std::string RegistrationResultToString(gloox::RegistrationResult res);
|
|
|
|
static std::string ConnectionErrorToString(gloox::ConnectionError err);
|
|
|
|
static std::string CertificateErrorToString(gloox::CertStatus status);
|
|
|
|
static std::time_t ComputeTimestamp(const glooxwrapper::Message& msg);
|
|
|
|
|
2013-11-07 21:07:24 +01:00
|
|
|
protected:
|
|
|
|
/* Xmpp handlers */
|
|
|
|
/* MUC handlers */
|
2019-09-13 17:24:44 +02:00
|
|
|
virtual void handleMUCParticipantPresence(glooxwrapper::MUCRoom& room, const glooxwrapper::MUCRoomParticipant, const glooxwrapper::Presence&);
|
|
|
|
virtual void handleMUCError(glooxwrapper::MUCRoom& room, gloox::StanzaError);
|
|
|
|
virtual void handleMUCMessage(glooxwrapper::MUCRoom& room, const glooxwrapper::Message& msg, bool priv);
|
|
|
|
virtual void handleMUCSubject(glooxwrapper::MUCRoom& room, const glooxwrapper::string& nick, const glooxwrapper::string& subject);
|
2013-11-07 21:07:24 +01:00
|
|
|
/* MUC handlers not supported by glooxwrapper */
|
|
|
|
// virtual bool handleMUCRoomCreation(glooxwrapper::MUCRoom*) {return false;}
|
|
|
|
// virtual void handleMUCInviteDecline(glooxwrapper::MUCRoom*, const glooxwrapper::JID&, const std::string&) {}
|
|
|
|
// virtual void handleMUCInfo(glooxwrapper::MUCRoom*, int, const std::string&, const glooxwrapper::DataForm*) {}
|
|
|
|
// virtual void handleMUCItems(glooxwrapper::MUCRoom*, const std::list<gloox::Disco::Item*, std::allocator<gloox::Disco::Item*> >&) {}
|
|
|
|
|
|
|
|
/* Log handler */
|
|
|
|
virtual void handleLog(gloox::LogLevel level, gloox::LogArea area, const std::string& message);
|
|
|
|
|
|
|
|
/* ConnectionListener handlers*/
|
|
|
|
virtual void onConnect();
|
|
|
|
virtual void onDisconnect(gloox::ConnectionError e);
|
|
|
|
virtual bool onTLSConnect(const glooxwrapper::CertInfo& info);
|
|
|
|
|
|
|
|
/* Iq Handlers */
|
|
|
|
virtual bool handleIq(const glooxwrapper::IQ& iq);
|
|
|
|
virtual void handleIqID(const glooxwrapper::IQ&, int) {}
|
|
|
|
|
|
|
|
/* Registration Handlers */
|
|
|
|
virtual void handleRegistrationFields(const glooxwrapper::JID& /*from*/, int fields, glooxwrapper::string instructions );
|
|
|
|
virtual void handleRegistrationResult(const glooxwrapper::JID& /*from*/, gloox::RegistrationResult result);
|
|
|
|
virtual void handleAlreadyRegistered(const glooxwrapper::JID& /*from*/);
|
|
|
|
virtual void handleDataForm(const glooxwrapper::JID& /*from*/, const glooxwrapper::DataForm& /*form*/);
|
|
|
|
virtual void handleOOB(const glooxwrapper::JID& /*from*/, const glooxwrapper::OOB& oob);
|
|
|
|
|
|
|
|
/* Message Handler */
|
2017-06-05 22:44:00 +02:00
|
|
|
virtual void handleMessage(const glooxwrapper::Message& msg, glooxwrapper::MessageSession* session);
|
2013-11-07 21:07:24 +01:00
|
|
|
|
STUN + XMPP ICE implementation.
Allows lobby players to host games without having to configure their
router.
Differential Revision: https://code.wildfiregames.com/D364
Fixes #2305
Patch By: fcxSanya.
StunClient based on code by SuperTuxKart, relicensed with approval of
the according authors hilnius, hiker, Auria, deveee, Flakebi, leper,
konstin and KroArtem.
Added rfc5245 (ejabberd) support, a GUI option, refactoring and segfault
fixes by myself.
Tested By: user1, Sandarac, Sestroretsk1714, Vladislav, Grugnas,
javiergodas
Partially Reviewed By: leper, Philip, echotangoecho
This was SVN commit r19703.
2017-06-01 08:33:52 +02:00
|
|
|
/* Session Handler */
|
2019-08-17 02:12:19 +02:00
|
|
|
virtual void handleSessionAction(gloox::Jingle::Action action, glooxwrapper::Jingle::Session& session, const glooxwrapper::Jingle::Session::Jingle& jingle);
|
|
|
|
virtual void handleSessionInitiation(glooxwrapper::Jingle::Session& session, const glooxwrapper::Jingle::Session::Jingle& jingle);
|
STUN + XMPP ICE implementation.
Allows lobby players to host games without having to configure their
router.
Differential Revision: https://code.wildfiregames.com/D364
Fixes #2305
Patch By: fcxSanya.
StunClient based on code by SuperTuxKart, relicensed with approval of
the according authors hilnius, hiker, Auria, deveee, Flakebi, leper,
konstin and KroArtem.
Added rfc5245 (ejabberd) support, a GUI option, refactoring and segfault
fixes by myself.
Tested By: user1, Sandarac, Sestroretsk1714, Vladislav, Grugnas,
javiergodas
Partially Reviewed By: leper, Philip, echotangoecho
This was SVN commit r19703.
2017-06-01 08:33:52 +02:00
|
|
|
|
2013-11-07 21:07:24 +01:00
|
|
|
public:
|
Rewrite lobby page to use class semantics, add more gamedetails labels, improve performance using batch processing and caching and gain possibility for game creation/player-join/leave events, refs #5387.
Game selection details features:
* Display victory conditions following their sending but missing display
following bffe917914, refs 7b0f6f530c.
* Display the host of the match and the game name in the selected game
details following 61261d14fc, refs D1666.
* Display mods if the mods differ (without having to attempt to join the
game prior) following eca956a513.
Performance features:
* Implement batch message processing in the XmppClient to rebuild GUI
objects only once when receiving backlog or returning from a match.
* Implement Game class to cache gamelist, filter and sorting values, as
they rarely change but are accessed often.
* Cache sprintf objects.
Security fixes:
* Add escapeText in lobby/ to avoid players breaking the lobby for every
participant, supersedes D720, comments by bb.
* Do not hide broadcasted unrecognized chat commands that mods used as
leaking private channels, fixes #5615.
Defect fixes:
* Fix XmppClient.cpp storing unused historic message types resulting in
memory waste and unintentional replay of for instance
disconnect/announcements messages following both e8dfde9ba6/D819 and
6bf74902a7/D2265, refs #3306.
* Fix XmppClient.cpp victoryCondition -> victoryConditions gamesetup.js
change from 6d54ab4c1f/D1240.
* Fix leaderboard/profile page cancel hotkey closing the lobby dialog as
well and removes cancel hotkey note from lobby_panels.xml from
960f2d7c31/D817 since the described issue was fixed by f9b529f2fb/D1701.
* Fix lobby playing menu sound in a running game after having closed the
lobby dialog following introduction in 960f2d7c31/D817.
* Fix GUI on nick change by updating g_Username.
* Update profile panel only with data matching the player requested.
Hack erasure:
* Object semantics make it cheap to add state and cache values, storing
literals in properties while removing globals, adding events while
decoupling components and gaining moddability.
* Erase comments and translation comments stating that this would be
IRC!!, supersedes D1136.
* Introduce Status chat message type to supersede "/special" chat
command + "isSpecial" property from bffe917914 (formerly g_specialKey
e6840f5fca) deluxe hack.
* Introduce System chat message type to supersede system errors
disguising as chat from a mock user called "system".
Code cleanups:
* Move code from XML to JS.
* Move size values from JS to XML, especially following 960f2d7c31/D817
and 7752219cef/D1051.
* Rename "user" to "player".
* Fix lobby/ eslint warnings, refs D2261.
* Remove message.nick emptiness check from 0940db3fc0/D835, since
XEP-0045 dictates that it is non-empty.
* Add translated string for deleted subjects.
* Add TODOs for some evident COList issues, refs #5638.
Differential Revision: https://code.wildfiregames.com/D2412
This was SVN commit r23172.
2019-11-21 14:44:41 +01:00
|
|
|
JS::Value GuiPollNewMessages(const ScriptInterface& scriptInterface);
|
2017-08-29 18:04:45 +02:00
|
|
|
JS::Value GuiPollHistoricMessages(const ScriptInterface& scriptInterface);
|
2019-09-11 13:51:34 +02:00
|
|
|
bool GuiPollHasPlayerListUpdate();
|
2013-11-07 21:07:24 +01:00
|
|
|
void SendMUCMessage(const std::string& message);
|
2019-09-06 07:14:20 +02:00
|
|
|
|
2016-03-21 14:48:22 +01:00
|
|
|
protected:
|
2019-09-06 07:14:20 +02:00
|
|
|
template<typename... Args>
|
2017-08-28 19:47:43 +02:00
|
|
|
void CreateGUIMessage(
|
|
|
|
const std::string& type,
|
2019-09-06 07:14:20 +02:00
|
|
|
const std::string& level,
|
|
|
|
const std::time_t time,
|
|
|
|
Args const&... args);
|
2013-11-07 21:07:24 +01:00
|
|
|
|
|
|
|
private:
|
2019-09-12 19:23:33 +02:00
|
|
|
struct SPlayer {
|
|
|
|
SPlayer(const gloox::Presence::PresenceType presence, const gloox::MUCRoomRole role, const glooxwrapper::string& rating)
|
|
|
|
: m_Presence(presence), m_Role(role), m_Rating(rating)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
gloox::Presence::PresenceType m_Presence;
|
|
|
|
gloox::MUCRoomRole m_Role;
|
|
|
|
glooxwrapper::string m_Rating;
|
|
|
|
};
|
|
|
|
using PlayerMap = std::map<glooxwrapper::string, SPlayer>;
|
|
|
|
|
2013-11-07 21:07:24 +01:00
|
|
|
/// Map of players
|
2019-09-12 19:23:33 +02:00
|
|
|
PlayerMap m_PlayerMap;
|
2019-09-11 13:51:34 +02:00
|
|
|
/// Whether or not the playermap has changed since the last time the GUI checked.
|
|
|
|
bool m_PlayerMapUpdate;
|
2013-11-07 21:07:24 +01:00
|
|
|
/// List of games
|
|
|
|
std::vector<const glooxwrapper::Tag*> m_GameList;
|
|
|
|
/// List of rankings
|
|
|
|
std::vector<const glooxwrapper::Tag*> m_BoardList;
|
2014-09-20 17:35:26 +02:00
|
|
|
/// Profile data
|
|
|
|
std::vector<const glooxwrapper::Tag*> m_Profile;
|
2019-09-06 07:14:20 +02:00
|
|
|
/// ScriptInterface to root the values
|
|
|
|
const ScriptInterface* m_ScriptInterface;
|
2014-01-24 19:20:15 +01:00
|
|
|
/// Queue of messages for the GUI
|
2019-09-06 07:14:20 +02:00
|
|
|
std::deque<JS::Heap<JS::Value> > m_GuiMessageQueue;
|
2017-08-29 18:04:45 +02:00
|
|
|
/// Cache of all GUI messages received since the login
|
2019-09-06 07:14:20 +02:00
|
|
|
std::vector<JS::Heap<JS::Value> > m_HistoricGuiMessages;
|
2014-01-24 19:20:15 +01:00
|
|
|
/// Current room subject/topic.
|
2019-09-12 19:23:33 +02:00
|
|
|
std::wstring m_Subject;
|
2013-11-07 21:07:24 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // XMPPCLIENT_H
|