Summary: | mode q assumed to represent channel owner privileges | ||
---|---|---|---|
Product: | [Applications] konversation | Reporter: | Philippe Cloutier <chealer> |
Component: | general | Assignee: | argonel <argonel> |
Status: | RESOLVED FIXED | ||
Severity: | normal | CC: | hein |
Priority: | NOR | ||
Version: | 1.0.1 | ||
Target Milestone: | --- | ||
Platform: | Debian testing | ||
OS: | Linux | ||
Latest Commit: | Version Fixed In: | ||
Sentry Crash Report: |
Description
Philippe Cloutier
2007-01-04 12:57:09 UTC
I just observed this today on OFTC. A troll was set +q by FloodServ which on OFTC is a "quiet" ban preventing the person from talking. Instead of telling me that the troll had been silenced, Konversation instead told me that he had been given ownership of the channel. That's not really a good thing. From Konversation's log file (I will spare you the gory details of the troll's pasting before he was auto-kicked): [Sun Mar 30 2008] [18:41:40] <arne> EVERYBODY IN THIS CHANNEL [..snip..] [Sun Mar 30 2008] [18:41:40] <arne> EVERYBODY IN THIS CHANNEL [..snip..] [Sun Mar 30 2008] [18:41:40] <arne> EVERYBODY IN THIS CHANNEL [..snip..] [Sun Mar 30 2008] [18:41:40] <arne> EVERYBODY IN THIS CHANNEL [..snip..] [Sun Mar 30 2008] [18:41:40] <arne> EVERYBODY IN THIS CHANNEL [..snip..] [Sun Mar 30 2008] [18:41:40] Kick arne has been kicked from the channel by debhelper (use the paster bot or #flood). [Sun Mar 30 2008] [18:41:40] Mode FloodServ gives channel owner privileges to *!*@213-67-202-123-no11.tbcn.telia.com. The last line is obviously incorrect... the troll tried to rejoin but was unable to continue because, as stated, +q on oftc devoices the person. On EuIRC & Co, +q is founder/owner status. Once again we get kicked in the groin for valiant attempts to make IRC localizable - with networks stepping on each other's toes left and right using the same numericals and mode chars, the only way we can keep nice, translatable messages is going to be to profile networks/servers and display different stuff depending on what one is connected to, which of course sucks. The workaround for the released version is to enable raw mode display in Behavior -> Chat Window in the preferences dialog. That will disable human-readable mode change messages in favor of simple mode +/-<mode> lines. Bug #148437 may be related. Possibly also related to bug #153580. commit dede2dae6424482b1c499d17f68b65a4a02d316e Author: eli mackenzie <argonel@gmail.com> Date: Fri Feb 5 15:30:45 2010 -0500 Change display of +q (et al) modes when they're not prefix modes. Non-prefix modes that are advertized by the 005 numeric as having a list will be displayed like bans, except for e and I, as we're in string freeze for 1.2.2. Servers that don't give a 005 will continue to have their messages displayed incorrectly. If you're aware of such a server, let us know. CCBUG:139591,224954 diff --git a/src/commit.h b/src/commit.h index 8405969..19d0e77 100644 --- a/src/commit.h +++ b/src/commit.h @@ -1,4 +1,4 @@ // This COMMIT number is added to version string to be used as "patch level" #ifndef COMMIT -#define COMMIT 4016 +#define COMMIT 4017 #endif diff --git a/src/irc/channel.cpp b/src/irc/channel.cpp index 6855dbb..9809970 100644 --- a/src/irc/channel.cpp +++ b/src/irc/channel.cpp @@ -1692,6 +1692,15 @@ void Channel::updateMode(const QString& sourceNick, char mode, bool plus, const bool fromMe=false; bool toMe=false; + bool banTypeThang = m_server->banAddressListModes().contains(QChar(mode)); + + // HACK to avoid changing strings for 1.2.2, we pretend any TYPE A mode is a + // ban except for e and I, as we have support for those + if (banTypeThang) + { + if (mode != 'b' && mode != 'e' && mode != 'I') + mode = 'b'; + } // remember if this nick had any type of op. bool wasAnyOp=false; diff --git a/src/irc/inputfilter.cpp b/src/irc/inputfilter.cpp index a5a9368..65d4b19 100644 --- a/src/irc/inputfilter.cpp +++ b/src/irc/inputfilter.cpp @@ -903,6 +903,7 @@ void InputFilter::parseServerCommand(const QString &prefix, const QString &comma { if(!value.isEmpty()) { + server->setChanModes(value); QString allowed = server->allowedChannelModes(); QString newModes = value.remove(','); if(!allowed.isEmpty()) //attempt to merge the two diff --git a/src/irc/server.cpp b/src/irc/server.cpp index 14758be..4ebc139 100644 --- a/src/irc/server.cpp +++ b/src/irc/server.cpp @@ -97,6 +97,7 @@ Server::Server(QObject* parent, ConnectionSettings& settings) : QObject(parent) // TODO fold these into a QMAP, and these need to be reset to RFC values if this server object is reused. m_serverNickPrefixModes = "ovh"; m_serverNickPrefixes = "@+%"; + m_banAddressListModes = "b"; // {RFC-1459, draft-brocklesby-irc-isupport} -> pick one m_channelPrefixes = "#&"; m_modesCount = 3; m_showSSLConfirmation = true; @@ -473,6 +474,12 @@ void Server::setPrefixes(const QString &modes, const QString& prefixes) m_serverNickPrefixes = prefixes; } +void Server::setChanModes(QString modes) +{ + QStringList abcd = modes.split(","); + m_banAddressListModes = abcd.value(0); +} + // return a nickname without possible mode character at the beginning void Server::mangleNicknameWithModes(QString& nickname,bool& isAdmin,bool& isOwner, bool& isOp,bool& isHalfop,bool& hasVoice) diff --git a/src/irc/server.h b/src/irc/server.h index f3d73b1..2d1d542 100644 --- a/src/irc/server.h +++ b/src/irc/server.h @@ -131,6 +131,9 @@ void resetNickSelection(); int getModesCount(); // extended user modes support + void setChanModes(QString); //grab modes types from RPL_ISUPPORT CHANMODES + QString banAddressListModes() { return m_banAddressListModes; } // aka "TYPE A" modes http://tools.ietf.org/html/draft-brocklesby-irc-isupport-03#section-3.3 + void setPrefixes(const QString &modes, const QString& prefixes); void mangleNicknameWithModes(QString &nickname,bool& isAdmin,bool& isOwner,bool &isOp, bool& isHalfop,bool &hasVoice); @@ -679,6 +682,9 @@ void resetNickSelection(); // TODO roll these into a QMap. QString m_serverNickPrefixes; // Prefixes used by the server to indicate a mode QString m_serverNickPrefixModes; // if supplied: modes related to those prefixes + + QString m_banAddressListModes; // "TYPE A" modes from RPL_ISUPPORT CHANMODES=A,B,C,D + QString m_channelPrefixes; // prefixes that indicate channel names. defaults to RFC1459 "#&" int m_modesCount; // Maximum number of channel modes with parameter allowed per MODE command. commit dede2dae6424482b1c499d17f68b65a4a02d316e Author: eli mackenzie <argonel@gmail.com> Date: Fri Feb 5 15:30:45 2010 -0500 Change display of +q (et al) modes when they're not prefix modes. Non-prefix modes that are advertized by the 005 numeric as having a list will be displayed like bans, except for e and I, as we're in string freeze for 1.2.2. Servers that don't give a 005 will continue to have their messages displayed incorrectly. If you're aware of such a server, let us know. CCBUG:139591,224954 diff --git a/src/commit.h b/src/commit.h index 8405969..19d0e77 100644 --- a/src/commit.h +++ b/src/commit.h @@ -1,4 +1,4 @@ // This COMMIT number is added to version string to be used as "patch level" #ifndef COMMIT -#define COMMIT 4016 +#define COMMIT 4017 #endif diff --git a/src/irc/channel.cpp b/src/irc/channel.cpp index 6855dbb..9809970 100644 --- a/src/irc/channel.cpp +++ b/src/irc/channel.cpp @@ -1692,6 +1692,15 @@ void Channel::updateMode(const QString& sourceNick, char mode, bool plus, const bool fromMe=false; bool toMe=false; + bool banTypeThang = m_server->banAddressListModes().contains(QChar(mode)); + + // HACK to avoid changing strings for 1.2.2, we pretend any TYPE A mode is a + // ban except for e and I, as we have support for those + if (banTypeThang) + { + if (mode != 'b' && mode != 'e' && mode != 'I') + mode = 'b'; + } // remember if this nick had any type of op. bool wasAnyOp=false; diff --git a/src/irc/inputfilter.cpp b/src/irc/inputfilter.cpp index a5a9368..65d4b19 100644 --- a/src/irc/inputfilter.cpp +++ b/src/irc/inputfilter.cpp @@ -903,6 +903,7 @@ void InputFilter::parseServerCommand(const QString &prefix, const QString &comma { if(!value.isEmpty()) { + server->setChanModes(value); QString allowed = server->allowedChannelModes(); QString newModes = value.remove(','); if(!allowed.isEmpty()) //attempt to merge the two diff --git a/src/irc/server.cpp b/src/irc/server.cpp index 14758be..4ebc139 100644 --- a/src/irc/server.cpp +++ b/src/irc/server.cpp @@ -97,6 +97,7 @@ Server::Server(QObject* parent, ConnectionSettings& settings) : QObject(parent) // TODO fold these into a QMAP, and these need to be reset to RFC values if this server object is reused. m_serverNickPrefixModes = "ovh"; m_serverNickPrefixes = "@+%"; + m_banAddressListModes = "b"; // {RFC-1459, draft-brocklesby-irc-isupport} -> pick one m_channelPrefixes = "#&"; m_modesCount = 3; m_showSSLConfirmation = true; @@ -473,6 +474,12 @@ void Server::setPrefixes(const QString &modes, const QString& prefixes) m_serverNickPrefixes = prefixes; } +void Server::setChanModes(QString modes) +{ + QStringList abcd = modes.split(","); + m_banAddressListModes = abcd.value(0); +} + // return a nickname without possible mode character at the beginning void Server::mangleNicknameWithModes(QString& nickname,bool& isAdmin,bool& isOwner, bool& isOp,bool& isHalfop,bool& hasVoice) diff --git a/src/irc/server.h b/src/irc/server.h index f3d73b1..2d1d542 100644 --- a/src/irc/server.h +++ b/src/irc/server.h @@ -131,6 +131,9 @@ void resetNickSelection(); int getModesCount(); // extended user modes support + void setChanModes(QString); //grab modes types from RPL_ISUPPORT CHANMODES + QString banAddressListModes() { return m_banAddressListModes; } // aka "TYPE A" modes http://tools.ietf.org/html/draft-brocklesby-irc-isupport-03#section-3.3 + void setPrefixes(const QString &modes, const QString& prefixes); void mangleNicknameWithModes(QString &nickname,bool& isAdmin,bool& isOwner,bool &isOp, bool& isHalfop,bool &hasVoice); @@ -679,6 +682,9 @@ void resetNickSelection(); // TODO roll these into a QMap. QString m_serverNickPrefixes; // Prefixes used by the server to indicate a mode QString m_serverNickPrefixModes; // if supplied: modes related to those prefixes + + QString m_banAddressListModes; // "TYPE A" modes from RPL_ISUPPORT CHANMODES=A,B,C,D + QString m_channelPrefixes; // prefixes that indicate channel names. defaults to RFC1459 "#&" int m_modesCount; // Maximum number of channel modes with parameter allowed per MODE command. commit dede2dae6424482b1c499d17f68b65a4a02d316e Author: eli mackenzie <argonel@gmail.com> Date: Fri Feb 5 15:30:45 2010 -0500 Change display of +q (et al) modes when they're not prefix modes. Non-prefix modes that are advertized by the 005 numeric as having a list will be displayed like bans, except for e and I, as we're in string freeze for 1.2.2. Servers that don't give a 005 will continue to have their messages displayed incorrectly. If you're aware of such a server, let us know. CCBUG:139591,224954 diff --git a/src/commit.h b/src/commit.h index 8405969..19d0e77 100644 --- a/src/commit.h +++ b/src/commit.h @@ -1,4 +1,4 @@ // This COMMIT number is added to version string to be used as "patch level" #ifndef COMMIT -#define COMMIT 4016 +#define COMMIT 4017 #endif diff --git a/src/irc/channel.cpp b/src/irc/channel.cpp index 6855dbb..9809970 100644 --- a/src/irc/channel.cpp +++ b/src/irc/channel.cpp @@ -1692,6 +1692,15 @@ void Channel::updateMode(const QString& sourceNick, char mode, bool plus, const bool fromMe=false; bool toMe=false; + bool banTypeThang = m_server->banAddressListModes().contains(QChar(mode)); + + // HACK to avoid changing strings for 1.2.2, we pretend any TYPE A mode is a + // ban except for e and I, as we have support for those + if (banTypeThang) + { + if (mode != 'b' && mode != 'e' && mode != 'I') + mode = 'b'; + } // remember if this nick had any type of op. bool wasAnyOp=false; diff --git a/src/irc/inputfilter.cpp b/src/irc/inputfilter.cpp index a5a9368..65d4b19 100644 --- a/src/irc/inputfilter.cpp +++ b/src/irc/inputfilter.cpp @@ -903,6 +903,7 @@ void InputFilter::parseServerCommand(const QString &prefix, const QString &comma { if(!value.isEmpty()) { + server->setChanModes(value); QString allowed = server->allowedChannelModes(); QString newModes = value.remove(','); if(!allowed.isEmpty()) //attempt to merge the two diff --git a/src/irc/server.cpp b/src/irc/server.cpp index 14758be..4ebc139 100644 --- a/src/irc/server.cpp +++ b/src/irc/server.cpp @@ -97,6 +97,7 @@ Server::Server(QObject* parent, ConnectionSettings& settings) : QObject(parent) // TODO fold these into a QMAP, and these need to be reset to RFC values if this server object is reused. m_serverNickPrefixModes = "ovh"; m_serverNickPrefixes = "@+%"; + m_banAddressListModes = "b"; // {RFC-1459, draft-brocklesby-irc-isupport} -> pick one m_channelPrefixes = "#&"; m_modesCount = 3; m_showSSLConfirmation = true; @@ -473,6 +474,12 @@ void Server::setPrefixes(const QString &modes, const QString& prefixes) m_serverNickPrefixes = prefixes; } +void Server::setChanModes(QString modes) +{ + QStringList abcd = modes.split(","); + m_banAddressListModes = abcd.value(0); +} + // return a nickname without possible mode character at the beginning void Server::mangleNicknameWithModes(QString& nickname,bool& isAdmin,bool& isOwner, bool& isOp,bool& isHalfop,bool& hasVoice) diff --git a/src/irc/server.h b/src/irc/server.h index f3d73b1..2d1d542 100644 --- a/src/irc/server.h +++ b/src/irc/server.h @@ -131,6 +131,9 @@ void resetNickSelection(); int getModesCount(); // extended user modes support + void setChanModes(QString); //grab modes types from RPL_ISUPPORT CHANMODES + QString banAddressListModes() { return m_banAddressListModes; } // aka "TYPE A" modes http://tools.ietf.org/html/draft-brocklesby-irc-isupport-03#section-3.3 + void setPrefixes(const QString &modes, const QString& prefixes); void mangleNicknameWithModes(QString &nickname,bool& isAdmin,bool& isOwner,bool &isOp, bool& isHalfop,bool &hasVoice); @@ -679,6 +682,9 @@ void resetNickSelection(); // TODO roll these into a QMap. QString m_serverNickPrefixes; // Prefixes used by the server to indicate a mode QString m_serverNickPrefixModes; // if supplied: modes related to those prefixes + + QString m_banAddressListModes; // "TYPE A" modes from RPL_ISUPPORT CHANMODES=A,B,C,D + QString m_channelPrefixes; // prefixes that indicate channel names. defaults to RFC1459 "#&" int m_modesCount; // Maximum number of channel modes with parameter allowed per MODE command. This is apparently still open because of the unfixed strings; Eli is looking into it. I'm not sure what you mean Eike, but I noticed that this was fixed. From #debian: [2014-03-06 16:58:33] --> Dinosaurio (~asdf@85.62-99-36.dynamic.clientes.euskaltel.es) a rejoint ce canal. [2014-03-06 16:58:36] <Dinosaurio> hi [2014-03-06 16:59:08] <-- hele_ (~hele@cs178075132196.pp.htv.fi) a quitté ce serveur (Quit: Konversation terminated!). [2014-03-06 16:59:09] <Dinosaurio> I've been reading the documentation of Debian and still can't find the command so as to answer this question [2014-03-06 16:59:12] --> hele_ (~hele@cs178075132196.pp.htv.fi) a rejoint ce canal. [2014-03-06 16:59:18] <Dinosaurio> why are you so gays? [2014-03-06 16:59:30] *** ChanServ donne les privilèges d'opérateur du canal à dondelelcaro. [2014-03-06 16:59:31] *** dondelelcaro définit le silence pour *!*@85.62-99-36.dynamic.clientes.euskaltel.es. [2014-03-06 16:59:31] *** dondelelcaro retire à dondelelcaro les privilèges d'opérateur du canal. |