X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcorenetwork.h;h=f07f2a288ca1c0dcf6b7b7c2d0e56ca0c753299b;hp=a77491245623fcb1a4266555fe863db19936dc51;hb=53e50ab66a5b3fa00282545ebc22ce3433ecf42b;hpb=e8a39b4c3c92e193ab861a3fea84a261bb6fbd24 diff --git a/src/core/corenetwork.h b/src/core/corenetwork.h index a7749124..f07f2a28 100644 --- a/src/core/corenetwork.h +++ b/src/core/corenetwork.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2018 by the Quassel Project * + * Copyright (C) 2005-2019 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -20,29 +20,27 @@ #pragma once -#include "network.h" -#include "coreircchannel.h" -#include "coreircuser.h" - -// IRCv3 capabilities -#include "irccap.h" +#include #include #ifdef HAVE_SSL -# include -# include +# include +# include #else -# include +# include #endif #ifdef HAVE_QCA2 -# include "cipher.h" +# include "cipher.h" #endif +#include "coreircchannel.h" +#include "coreircuser.h" #include "coresession.h" - -#include +#include "irccap.h" +#include "irctag.h" +#include "network.h" class CoreIdentity; class CoreUserInputHandler; @@ -54,38 +52,38 @@ class CoreNetwork : public Network Q_OBJECT public: - CoreNetwork(const NetworkId &networkid, CoreSession *session); + CoreNetwork(const NetworkId& networkid, CoreSession* session); ~CoreNetwork() override; - inline CoreIdentity *identityPtr() const { return coreSession()->identity(identity()); } - inline CoreSession *coreSession() const { return _coreSession; } - inline CoreNetworkConfig *networkConfig() const { return coreSession()->networkConfig(); } + inline CoreIdentity* identityPtr() const { return coreSession()->identity(identity()); } + inline CoreSession* coreSession() const { return _coreSession; } + inline CoreNetworkConfig* networkConfig() const { return coreSession()->networkConfig(); } - inline CoreUserInputHandler *userInputHandler() const { return _userInputHandler; } - inline CoreIgnoreListManager *ignoreListManager() { return coreSession()->ignoreListManager(); } + inline CoreUserInputHandler* userInputHandler() const { return _userInputHandler; } + inline CoreIgnoreListManager* ignoreListManager() { return coreSession()->ignoreListManager(); } //! Decode a string using the server (network) decoding. - inline QString serverDecode(const QByteArray &string) const { return decodeServerString(string); } + inline QString serverDecode(const QByteArray& string) const { return decodeServerString(string); } //! Decode a string using a channel-specific encoding if one is set (and use the standard encoding else). - QString channelDecode(const QString &channelName, const QByteArray &string) const; + QString channelDecode(const QString& channelName, const QByteArray& string) const; //! Decode a string using an IrcUser-specific encoding, if one exists (using the standaed encoding else). - QString userDecode(const QString &userNick, const QByteArray &string) const; + QString userDecode(const QString& userNick, const QByteArray& string) const; //! Encode a string using the server (network) encoding. - inline QByteArray serverEncode(const QString &string) const { return encodeServerString(string); } + inline QByteArray serverEncode(const QString& string) const { return encodeServerString(string); } //! Encode a string using the channel-specific encoding, if set, and use the standard encoding else. - QByteArray channelEncode(const QString &channelName, const QString &string) const; + QByteArray channelEncode(const QString& channelName, const QString& string) const; //! Encode a string using the user-specific encoding, if set, and use the standard encoding else. - QByteArray userEncode(const QString &userNick, const QString &string) const; + QByteArray userEncode(const QString& userNick, const QString& string) const; - inline QString channelKey(const QString &channel) const { return _channelKeys.value(channel.toLower(), QString()); } + inline QString channelKey(const QString& channel) const { return _channelKeys.value(channel.toLower(), QString()); } - inline QByteArray readChannelCipherKey(const QString &channel) const { return _cipherKeys.value(channel.toLower()); } - inline void storeChannelCipherKey(const QString &channel, const QByteArray &key) { _cipherKeys[channel.toLower()] = key; } + inline QByteArray readChannelCipherKey(const QString& channel) const { return _cipherKeys.value(channel.toLower()); } + inline void storeChannelCipherKey(const QString& channel, const QByteArray& key) { _cipherKeys[channel.toLower()] = key; } /** * Checks if the given target has an automatic WHO in progress @@ -93,10 +91,7 @@ public: * @param name Channel or nickname * @return True if an automatic WHO is in progress, otherwise false */ - inline bool isAutoWhoInProgress(const QString &name) const - { - return _autoWhoPending.value(name.toLower(), 0); - } + inline bool isAutoWhoInProgress(const QString& name) const { return _autoWhoPending.value(name.toLower(), 0); } inline UserId userId() const { return _coreSession->user(); } @@ -135,7 +130,9 @@ public: */ inline bool isPongReplyPending() const { return _pongReplyPending; } - QList> splitMessage(const QString &cmd, const QString &message, std::function(QString &)> cmdGenerator); + QList> splitMessage(const QString& cmd, + const QString& message, + const std::function(QString&)>& cmdGenerator); // IRCv3 capability negotiation @@ -144,8 +141,7 @@ public: * * @returns True if in progress, otherwise false */ - inline bool capNegotiationInProgress() const { return (!_capsQueuedIndividual.empty() || - !_capsQueuedBundled.empty()); } + inline bool capNegotiationInProgress() const { return (!_capsQueuedIndividual.empty() || !_capsQueuedBundled.empty()); } /** * Queues a capability to be requested. @@ -155,7 +151,7 @@ public: * * @param[in] capability Name of the capability */ - void queueCap(const QString &capability); + void queueCap(const QString& capability); /** * Begins capability negotiation if capabilities are queued, otherwise returns. @@ -198,16 +194,14 @@ public: * * See: http://ircv3.net/specs/extensions/sasl-3.2.html */ - const QStringList capsRequiringConfiguration = QStringList { - IrcCap::SASL - }; + const QStringList capsRequiringConfiguration = QStringList{IrcCap::SASL}; public slots: - void setMyNick(const QString &mynick) override; + void setMyNick(const QString& mynick) override; void requestConnect() const override; void requestDisconnect() const override; - void requestSetNetworkInfo(const NetworkInfo &info) override; + void requestSetNetworkInfo(const NetworkInfo& info) override; void setUseAutoReconnect(bool) override; void setAutoReconnectInterval(quint32) override; @@ -243,7 +237,7 @@ public slots: * @param reason Reason for quitting, defaulting to the user-configured quit reason * @param withReconnect Reconnect to the network after disconnecting (e.g. ping timeout) */ - void disconnectFromIrc(bool requested = true, const QString &reason = QString(), bool withReconnect = false); + void disconnectFromIrc(bool requested = true, const QString& reason = QString(), bool withReconnect = false); /** * Forcibly close the IRC server socket, waiting for it to close. @@ -256,7 +250,7 @@ public slots: */ bool forceDisconnect(int msecs = 1000); - void userInput(BufferInfo bufferInfo, QString msg); + void userInput(const BufferInfo& bufferInfo, QString msg); /** * Sends the raw (encoded) line, adding to the queue if needed, optionally with higher priority. @@ -269,7 +263,7 @@ public slots: * PING/PONG replies, the other side will close the connection. * @endparmblock */ - void putRawLine(const QByteArray input, const bool prepend = false); + void putRawLine(const QByteArray& input, bool prepend = false); /** * Sends the command with encoded parameters, with optional prefix or high priority. @@ -284,7 +278,7 @@ public slots: * maintain PING/PONG replies, the other side will close the connection. * @endparmblock */ - void putCmd(const QString &cmd, const QList ¶ms, const QByteArray &prefix = QByteArray(), const bool prepend = false); + void putCmd(const QString& cmd, const QList& params, const QByteArray& prefix = {}, const QHash &tags = {}, bool prepend = false); /** * Sends the command for each set of encoded parameters, with optional prefix or high priority. @@ -303,19 +297,19 @@ public slots: * cannot maintain PING/PONG replies, the other side will close the connection. * @endparmblock */ - void putCmd(const QString &cmd, const QList> ¶ms, const QByteArray &prefix = QByteArray(), const bool prependAll = false); + void putCmd(const QString& cmd, const QList>& params, const QByteArray& prefix = {}, const QHash &tags = {}, bool prependAll = false); - void setChannelJoined(const QString &channel); - void setChannelParted(const QString &channel); - void addChannelKey(const QString &channel, const QString &key); - void removeChannelKey(const QString &channel); + void setChannelJoined(const QString& channel); + void setChannelParted(const QString& channel); + void addChannelKey(const QString& channel, const QString& key); + void removeChannelKey(const QString& channel); // Blowfish stuff #ifdef HAVE_QCA2 - Cipher *cipher(const QString &recipient); - QByteArray cipherKey(const QString &recipient) const; - void setCipherKey(const QString &recipient, const QByteArray &key); - bool cipherUsesCBC(const QString &target); + Cipher* cipher(const QString& recipient); + QByteArray cipherKey(const QString& recipient) const; + void setCipherKey(const QString& recipient, const QByteArray& key); + bool cipherUsesCBC(const QString& target); #endif // Custom rate limiting (can be connected to signals) @@ -361,7 +355,7 @@ public slots: * * @param[in] capability Name of the capability */ - void serverCapAdded(const QString &capability); + void serverCapAdded(const QString& capability); /** * Indicates a capability was acknowledged (enabled by the IRC server). @@ -370,7 +364,7 @@ public slots: * * @param[in] capability Name of the capability */ - void serverCapAcknowledged(const QString &capability); + void serverCapAcknowledged(const QString& capability); /** * Indicates a capability was removed from the list of available capabilities. @@ -379,7 +373,7 @@ public slots: * * @param[in] capability Name of the capability */ - void serverCapRemoved(const QString &capability); + void serverCapRemoved(const QString& capability); /** * Sends the next capability from the queue. @@ -401,7 +395,7 @@ public slots: * * @param[in] name Channel or nickname */ - void queueAutoWhoOneshot(const QString &name); + void queueAutoWhoOneshot(const QString& name); /** * Checks if the given target has an automatic WHO in progress, and sets it as done if so @@ -409,9 +403,9 @@ public slots: * @param name Channel or nickname * @return True if an automatic WHO is in progress (and should be silenced), otherwise false */ - bool setAutoWhoDone(const QString &name); + bool setAutoWhoDone(const QString& name); - void updateIssuedModes(const QString &requestedModes); + void updateIssuedModes(const QString& requestedModes); void updatePersistentModes(QString addModes, QString removeModes); void resetPersistentModes(); @@ -424,43 +418,59 @@ public slots: */ inline void resetPongReplyPending() { _pongReplyPending = false; } - inline void displayMsg(Message::Type msgType, BufferInfo::Type bufferType, const QString &target, const QString &text, const QString &sender = "", Message::Flags flags = Message::None) + void onDisplayMsg(Message::Type msgType, + BufferInfo::Type bufferType, + const QString& target, + const QString& text, + const QString& sender, + Message::Flags flags) { emit displayMsg(networkId(), msgType, bufferType, target, text, sender, flags); } - signals: void recvRawServerMsg(QString); void displayStatusMsg(QString); - void displayMsg(NetworkId, Message::Type, BufferInfo::Type, const QString &target, const QString &text, const QString &sender = "", Message::Flags flags = Message::None); + void displayMsg( + NetworkId, Message::Type, BufferInfo::Type, const QString& target, const QString& text, const QString& sender, Message::Flags flags); void disconnected(NetworkId networkId); - void connectionError(const QString &errorMsg); + void connectionError(const QString& errorMsg); void quitRequested(NetworkId networkId); - void sslErrors(const QVariant &errorData); - - void newEvent(Event *event); - void socketInitialized(const CoreIdentity *identity, const QHostAddress &localAddress, quint16 localPort, const QHostAddress &peerAddress, quint16 peerPort, qint64 socketId); - void socketDisconnected(const CoreIdentity *identity, const QHostAddress &localAddress, quint16 localPort, const QHostAddress &peerAddress, quint16 peerPort, qint64 socketId); + void sslErrors(const QVariant& errorData); + + void newEvent(Event* event); + void socketInitialized(const CoreIdentity* identity, + const QHostAddress& localAddress, + quint16 localPort, + const QHostAddress& peerAddress, + quint16 peerPort, + qint64 socketId); + void socketDisconnected(const CoreIdentity* identity, + const QHostAddress& localAddress, + quint16 localPort, + const QHostAddress& peerAddress, + quint16 peerPort, + qint64 socketId); protected: - inline IrcChannel *ircChannelFactory(const QString &channelname) override { return new CoreIrcChannel(channelname, this); } - inline IrcUser *ircUserFactory(const QString &hostmask) override { return new CoreIrcUser(hostmask, this); } + inline IrcChannel* ircChannelFactory(const QString& channelname) override { return new CoreIrcChannel(channelname, this); } + inline IrcUser* ircUserFactory(const QString& hostmask) override { return new CoreIrcUser(hostmask, this); } protected slots: // TODO: remove cached cipher keys, when appropriate - //virtual void removeIrcUser(IrcUser *ircuser); - //virtual void removeIrcChannel(IrcChannel *ircChannel); - //virtual void removeChansAndUsers(); + // virtual void removeIrcUser(IrcUser *ircuser); + // virtual void removeIrcChannel(IrcChannel *ircChannel); + // virtual void removeChansAndUsers(); private slots: - void socketHasData(); - void socketError(QAbstractSocket::SocketError); - void socketInitialized(); - void socketCloseTimeout(); - void socketDisconnected(); - void socketStateChanged(QAbstractSocket::SocketState); + void onSocketHasData(); + void onSocketError(QAbstractSocket::SocketError); + void onSocketInitialized(); + void onSocketCloseTimeout(); + void onSocketDisconnected(); + void onSocketStateChanged(QAbstractSocket::SocketState); + void networkInitialized(); void sendPerform(); @@ -473,7 +483,7 @@ private slots: void startAutoWhoCycle(); #ifdef HAVE_SSL - void sslErrors(const QList &errors); + void onSslErrors(const QList& errors); #endif /** @@ -495,13 +505,24 @@ private slots: */ void fillBucketAndProcessQueue(); - void writeToSocket(const QByteArray &data); + void writeToSocket(const QByteArray& data); + +private: + void showMessage(Message::Type msgType, + BufferInfo::Type bufferType, + const QString& target, + const QString& text, + const QString& sender = "", + Message::Flags flags = Message::None) + { + emit displayMsg(networkId(), msgType, bufferType, target, text, sender, flags); + } private: - CoreSession *_coreSession; + CoreSession* _coreSession; - bool _debugLogRawIrc; ///< If true, include raw IRC socket messages in the debug log - qint32 _debugLogRawNetId; ///< Network ID for logging raw IRC socket messages, or -1 for all + bool _debugLogRawIrc; ///< If true, include raw IRC socket messages in the debug log + qint32 _debugLogRawNetId; ///< Network ID for logging raw IRC socket messages, or -1 for all #ifdef HAVE_SSL QSslSocket socket; @@ -510,9 +531,9 @@ private: #endif qint64 _socketId{0}; - CoreUserInputHandler *_userInputHandler; + CoreUserInputHandler* _userInputHandler; - QHash _channelKeys; // stores persistent channels and their passwords, if any + QHash _channelKeys; // stores persistent channels and their passwords, if any QTimer _autoReconnectTimer; int _autoReconnectCount; @@ -541,7 +562,7 @@ private: bool _pongTimestampValid = false; ///< If true, IRC server responds to PING by quoting in PONG // This tracks whether or not a server responds to PING with a PONG of what was sent, or if it // does something else. If false, PING reply hiding should be more aggressive. - bool _pongReplyPending = false; ///< If true, at least one PING sent without a PONG reply + bool _pongReplyPending = false; ///< If true, at least one PING sent without a PONG reply QStringList _autoWhoQueue; QHash _autoWhoPending; @@ -559,9 +580,9 @@ private: // If this happens, we need a way to retry each capability individually in order to avoid having // one failing capability (e.g. SASL) block all other capabilities. - bool _capNegotiationActive; /// Whether or not full capability negotiation was started + bool _capNegotiationActive; /// Whether or not full capability negotiation was started // Avoid displaying repeat "negotiation finished" messages - bool _capInitialNegotiationEnded; /// Whether or not initial capability negotiation finished + bool _capInitialNegotiationEnded; /// Whether or not initial capability negotiation finished // Avoid sending repeat "CAP END" replies when registration is already ended /** @@ -586,13 +607,13 @@ private: QTimer _tokenBucketTimer; // No need for int type as one cannot travel into the past (at least not yet, Doc) - quint32 _messageDelay; /// Token refill speed in ms - quint32 _burstSize; /// Size of the token bucket - quint32 _tokenBucket; /// The virtual bucket that holds the tokens - QList _msgQueue; /// Queue of messages waiting to be sent - bool _skipMessageRates; /// If true, skip all message rate limits + quint32 _messageDelay; /// Token refill speed in ms + quint32 _burstSize; /// Size of the token bucket + quint32 _tokenBucket; /// The virtual bucket that holds the tokens + QList _msgQueue; /// Queue of messages waiting to be sent + bool _skipMessageRates; /// If true, skip all message rate limits - QString _requestedUserModes; // 2 strings separated by a '-' character. first part are requested modes to add, the second to remove + QString _requestedUserModes; // 2 strings separated by a '-' character. first part are requested modes to add, the second to remove // List of blowfish keys for channels QHash _cipherKeys;