Files
znc/modules/fixfreenode.cpp
psychon 7b240d5330 Update fixfreenode
freenode now also allows using CAP to request the identify-msg capability.
Plus point is that one can also disable it via this interface
(CAP REQ :-identify-msg), but we still don't want any client
to enable it at all.


git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@2016 726aef4b-f618-498e-8847-2d620e286838
2010-06-07 12:41:56 +00:00

94 lines
2.5 KiB
C++

/*
* Copyright (C) 2004-2010 See the AUTHORS file for details.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation.
*/
#include "Modules.h"
#include "User.h"
class CPreventIdMsgMod : public CModule {
public:
MODCONSTRUCTOR(CPreventIdMsgMod) {}
/* Old style:
* -> CAPAB :identify-msg
* We just block this request from the client.
*
* New style:
* -> CAP LS
* <- :farmer.freenode.net CAP <nick> LS :identify-msg <other stuff>
* -> CAP REQ :identify-msg
* <- :farmer.freenode.net CAP a ACK :identify-msg
* We block the identify-msg token from CAP LS and CAP REQ,
* just to be sure.
*/
// Returns true if an "identify-msg" was skipped
static bool MakeCleanCapList(CString& sList) {
bool bRet = false;
VCString vsList;
sList.Split(" ", vsList);
sList = "";
// Append each token to the output list
for (VCString::const_iterator it = vsList.begin();
it != vsList.end(); ++it) {
if (!it->Equals("identify-msg")) {
sList += *it + " ";
} else {
bRet = true;
}
}
// Remove the last space we added
sList.RightChomp();
return bRet;
}
virtual EModRet OnUserRaw(CString& sLine) {
if (sLine.Token(0).Equals("CAPAB")) {
if (sLine.AsLower().find("identify-msg") != CString::npos
|| sLine.AsLower().find("identify-ctcp") != CString::npos)
return HALTCORE;
} else if (sLine.Token(0).Equals("CAP")) {
if (sLine.Token(1).Equals("REQ")) {
CString sList = sLine.Token(2, true).TrimPrefix_n(":");
if (MakeCleanCapList(sList)) {
// There was an identify-msg requested,
// block the whole list
PutUser(":irc.znc.in CAP " + m_pUser->GetIRCNick().GetNick()
+ " NAK " + sLine.Token(2, true));
return HALTCORE;
}
}
}
return CONTINUE;
}
virtual EModRet OnRaw(CString& sLine) {
if (!sLine.Token(1).Equals("CAP"))
return CONTINUE;
if (!sLine.Token(3).Equals("LS"))
return CONTINUE;
// It's CAP LS, strip identify-msg
// First, copy over the "prefix" from the old line
CString sNewLine = sLine.Token(0) + " " + sLine.Token(1) + " ";
sNewLine += sLine.Token(2) + " " + sLine.Token(3) + " :";
// Grab the list of CAP tokens and clean them up
CString sTokens = sLine.Token(4, true).TrimPrefix_n(":");
MakeCleanCapList(sTokens);
sLine = sNewLine + sTokens;
return CONTINUE;
}
};
MODULEDEFS(CPreventIdMsgMod, "Prevent client from sending IDENTIFY-MSG to server")