diff options
Diffstat (limited to 'src/modules/options/OptionsWidget_nickserv.cpp')
| -rw-r--r-- | src/modules/options/OptionsWidget_nickserv.cpp | 371 |
1 files changed, 371 insertions, 0 deletions
diff --git a/src/modules/options/OptionsWidget_nickserv.cpp b/src/modules/options/OptionsWidget_nickserv.cpp new file mode 100644 index 000000000..d6da68662 --- /dev/null +++ b/src/modules/options/OptionsWidget_nickserv.cpp @@ -0,0 +1,371 @@ +//============================================================================= +// +// File : OptionsWidget_nickserv.cpp +// Creation date : Fri Aug 10 2001 03:38:10 CEST by Szymon Stefanek +// +// This file is part of the KVIrc irc client distribution +// Copyright (C) 2001-2010 Szymon Stefanek (pragma at kvirc dot net) +// +// This program 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 opinion) any later version. +// +// This program 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 this program. If not, write to the Free Software Foundation, +// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +//============================================================================= + +#include "OptionsWidget_nickserv.h" + +#include "KviQString.h" +#include "KviOptions.h" +#include "KviLocale.h" +#include "KviNickServRuleSet.h" +#include "KviIrcMask.h" +#include "KviTalToolTip.h" +#include <QTreeWidget> + +#include <QLayout> +#include <QLineEdit> +#include <QPushButton> +#include <QMessageBox> + + +// KviApplication.cpp +extern KVIRC_API KviNickServRuleSet * g_pNickServRuleSet; + + +NickServRuleEditor::NickServRuleEditor(QWidget * par,bool bUseServerMaskField) +: QDialog(par) +{ + setWindowTitle(__tr2qs_ctx("NickServ Authentication Rule","options")); + + QString html_center_begin = "<center>"; + QString html_center_end = "</center>"; + + QGridLayout * gl = new QGridLayout(this);//,bUseServerMaskField ? 7 : 6,4,10,5); + + QLabel * l = new QLabel(__tr2qs_ctx("Registered NickName","options"),this); + gl->addWidget(l,0,0); + + m_pRegisteredNickEdit = new QLineEdit(this); + KviTalToolTip::add(m_pRegisteredNickEdit,html_center_begin + __tr2qs_ctx("Put here the nickname that you have registered with NickServ","options") + html_center_end); + gl->addWidget(m_pRegisteredNickEdit,0,1,1,3); +// gl->addMultiCellWidget(m_pRegisteredNickEdit,0,0,1,3); + + l = new QLabel(__tr2qs_ctx("NickServ Mask","options"),this); + gl->addWidget(l,1,0); + + m_pNickServMaskEdit = new QLineEdit(this); + KviTalToolTip::add(m_pNickServMaskEdit, + html_center_begin + __tr2qs_ctx("This is the mask that NickServ must match to be correctly identified as the NickServ service. " \ + "This usually will be something like <b>NickServ!service@services.dalnet</b>.<br>" \ + "You can use wildcards for this field, but generally it is a security flaw. " \ + "If you're 100%% sure that NO user on the network can use the nickname \"NickServ\", " \ + "the mask <b>NickServ!*@*</b> may be safe to use in this field.","options") + html_center_end); + gl->addWidget(m_pNickServMaskEdit,1,1,1,3); +// gl->addMultiCellWidget(m_pNickServMaskEdit,1,1,1,3); + + l = new QLabel(__tr2qs_ctx("Message Regexp","options"),this); + gl->addWidget(l,2,0); + + m_pMessageRegexpEdit = new QLineEdit(this); + gl->addWidget(m_pMessageRegexpEdit,2,2,1,3); +// gl->addMultiCellWidget(m_pMessageRegexpEdit,2,2,1,3); + + KviTalToolTip::add(m_pMessageRegexpEdit, + html_center_begin + __tr2qs_ctx("This is the simple regular expression that the identification request message " \ + "from NickServ must match in order to be correctly recognized.<br>" \ + "The message is usually something like \"To identify yourself please use /ns IDENTIFY password\" " \ + "and it is sent when the NickServ wants you to authenticate yourself. " \ + "You can use the * and ? wildcards.","options") + html_center_end); + l = new QLabel(__tr2qs_ctx("Identify Command","options"),this); + gl->addWidget(l,3,0); + + m_pIdentifyCommandEdit = new QLineEdit(this); + KviTalToolTip::add(m_pIdentifyCommandEdit, + html_center_begin + __tr2qs_ctx("This is the command that will be executed when NickServ requests authentication " \ + "for the nickname described in this rule (if the both server and NickServ mask are matched). " \ + "This usually will be something like <b>msg NickServ identify <yourpassword></b>.<br>" \ + "You can use <b>msg -q</b> if you don't want the password echoed on the screen. " \ + "Please note that there is no leading slash in this command.","options") + html_center_end); + gl->addWidget(m_pIdentifyCommandEdit,3,1,1,3); +// gl->addMultiCellWidget(m_pIdentifyCommandEdit,3,3,1,3); + + int iNextLine = 4; + + if(bUseServerMaskField) + { + l = new QLabel(__tr2qs_ctx("Server mask","options"),this); + gl->addWidget(l,4,0); + + m_pServerMaskEdit = new QLineEdit(this); + KviTalToolTip::add(m_pServerMaskEdit, + html_center_begin + __tr2qs_ctx("This is the mask that the current server must match in order " \ + "for this rule to apply. It can contain * and ? wildcards.<br>Do NOT use simply \"*\" here...","options") + html_center_end); + gl->addWidget(m_pServerMaskEdit,4,1,1,3); +// gl->addMultiCellWidget(m_pServerMaskEdit,4,4,1,3); + iNextLine++; + } else { + m_pServerMaskEdit = 0; + } + + + l = new QLabel(html_center_begin + __tr2qs_ctx("Hint: Move the mouse cursor over the fields to get help","options") + html_center_end,this); + l->setMargin(10); + gl->addWidget(l,iNextLine,0,1,4); +// gl->addMultiCellWidget(l,iNextLine,iNextLine,0,3); + + iNextLine++; + + QPushButton * p = new QPushButton(__tr2qs_ctx("Cancel","options"),this); + p->setMinimumWidth(100); + connect(p,SIGNAL(clicked()),this,SLOT(reject())); + gl->addWidget(p,iNextLine,2); + + m_pOkButton = new QPushButton(__tr2qs_ctx("OK","options"),this); + m_pOkButton->setMinimumWidth(100); + m_pOkButton->setDefault(true); + connect(m_pOkButton,SIGNAL(clicked()),this,SLOT(okPressed())); + gl->addWidget(m_pOkButton,iNextLine,3); + + gl->setColumnStretch(1,1); + gl->setRowStretch(bUseServerMaskField ? 5 : 4,1); + + setMinimumWidth(250); +} + +NickServRuleEditor::~NickServRuleEditor() +{ +} + +bool NickServRuleEditor::validate() +{ + QString s = m_pRegisteredNickEdit->text(); + + QString m = __tr2qs_ctx("Invalid NickServ Rule","options"); + QString o = __tr2qs_ctx("OK","options"); + + if(s.isEmpty()) + { + QMessageBox::warning(this,m,__tr2qs_ctx("The Nickname field can't be empty!","options"),o); + return false; + } + + if(s.indexOf(QChar(' ')) != -1) + { + QMessageBox::warning(this,m,__tr2qs_ctx("The Nickname field can't contain spaces!","options"),o); + return false; + } + + s = m_pNickServMaskEdit->text(); + + if(s.isEmpty()) + { + QMessageBox::warning(this,m,__tr2qs_ctx("The NickServ mask can't be empty!<br>You must put at least * there.","options"),o); + return false; + } + + s = m_pMessageRegexpEdit->text(); + + if(s.isEmpty()) + { + QMessageBox::warning(this,m,__tr2qs_ctx("The Message Regexp can't be empty!<br>You must put at least * there.","options"),o); + return false; + } + + s = m_pIdentifyCommandEdit->text(); + + if(s.isEmpty()) + { + QMessageBox::warning(this,m,__tr2qs_ctx("The Identify Command can't be empty!","options"),o); + return false; + } + + return true; +} + +void NickServRuleEditor::okPressed() +{ + if(!validate())return; + accept(); +} + +bool NickServRuleEditor::editRule(KviNickServRule * r) +{ + m_pRegisteredNickEdit->setText(r->registeredNick().isEmpty() ? QString("MyNick") : r->registeredNick()); + m_pNickServMaskEdit->setText(r->nickServMask().isEmpty() ? QString("NickServ!*@*") : r->nickServMask()); + m_pMessageRegexpEdit->setText(r->messageRegexp().isEmpty() ? QString("*IDENTIFY*") : r->messageRegexp()); + m_pIdentifyCommandEdit->setText(r->identifyCommand().isEmpty() ? QString("msg -q NickServ IDENTIFY <password>") : r->identifyCommand()); + if(m_pServerMaskEdit) + m_pServerMaskEdit->setText(r->serverMask().isEmpty() ? QString("irc.yourserver.org") : r->serverMask()); + m_pRegisteredNickEdit->selectAll(); + if(exec() != QDialog::Accepted)return false; + r->setRegisteredNick(m_pRegisteredNickEdit->text()); + r->setNickServMask(m_pNickServMaskEdit->text()); + r->setMessageRegexp(m_pMessageRegexpEdit->text()); + r->setIdentifyCommand(m_pIdentifyCommandEdit->text()); + if(m_pServerMaskEdit) + r->setServerMask(m_pServerMaskEdit->text()); + return true; +} + + +OptionsWidget_nickServ::OptionsWidget_nickServ(QWidget * parent) +: KviOptionsWidget(parent) +{ + createLayout(); + setObjectName("nickserv_options_widget"); + + QGridLayout * gl = layout(); + + KviNickServRuleSet * rs = g_pNickServRuleSet; + bool bNickServEnabled = rs ? (rs->isEnabled() && !rs->isEmpty()) : false; + + m_pNickServCheck = new QCheckBox(__tr2qs_ctx("Enable NickServ Identification","options"),this); + gl->addWidget(m_pNickServCheck,0,0,1,3); +// gl->addMultiCellWidget(m_pNickServCheck,0,0,0,2); + KviTalToolTip::add(m_pNickServCheck,__tr2qs_ctx("This check enables the automatic identification with NickServ","options")); + m_pNickServCheck->setChecked(bNickServEnabled); + + m_pNickServTreeWidget = new QTreeWidget(this); + m_pNickServTreeWidget->setSelectionMode(QAbstractItemView::SingleSelection); + m_pNickServTreeWidget->setAllColumnsShowFocus(true); + QStringList columnLabels; + + columnLabels.append(__tr2qs_ctx("Nickname","options")); + columnLabels.append(__tr2qs_ctx("Server mask","options")); + columnLabels.append(__tr2qs_ctx("NickServ Mask","options")); + columnLabels.append(__tr2qs_ctx("NickServ Request Mask","options")); + columnLabels.append(__tr2qs_ctx("Identify Command","options")); + m_pNickServTreeWidget->setHeaderLabels(columnLabels); + connect(m_pNickServTreeWidget,SIGNAL(itemSelectionChanged()),this,SLOT(enableDisableNickServControls())); + + gl->addWidget(m_pNickServTreeWidget,1,0,1,3); +// gl->addMultiCellWidget(m_pNickServTreeWidget,1,1,0,2); + KviTalToolTip::add(m_pNickServTreeWidget,\ + __tr2qs_ctx("<center>This is a list of NickServ identification rules. " \ + "KVIrc will use them to model its automatic interaction with NickServ on all the networks.<br>" \ + "Please be aware that this feature can cause your NickServ passwords to be stolen " \ + "if used improperly. Make sure that you fully understand the NickServ authentication protocol.<br>" \ + "In other words, be sure to know what you're doing.<br>" \ + "Also note that the password that you provide is stored as <b>PLAIN TEXT</b>.<br>" \ + "KVIrc supports also per-network NickServ authentication rules that can be " \ + "created in the \"Advanced...\" network options (accessible from the servers dialog)." + "</center>","options")); + + m_pAddRuleButton = new QPushButton(__tr2qs_ctx("Add Rule","options"),this); + connect(m_pAddRuleButton,SIGNAL(clicked()),this,SLOT(addNickServRule())); + gl->addWidget(m_pAddRuleButton,2,0); + + m_pEditRuleButton = new QPushButton(__tr2qs_ctx("Edit Rule","options"),this); + connect(m_pEditRuleButton,SIGNAL(clicked()),this,SLOT(editNickServRule())); + gl->addWidget(m_pEditRuleButton,2,1); + + m_pDelRuleButton = new QPushButton(__tr2qs_ctx("Delete Rule","options"),this); + connect(m_pDelRuleButton,SIGNAL(clicked()),this,SLOT(delNickServRule())); + gl->addWidget(m_pDelRuleButton,2,2); + + connect(m_pNickServCheck,SIGNAL(toggled(bool)),this,SLOT(enableDisableNickServControls())); + + if(rs && rs->rules()) + { + QTreeWidgetItem *it; + KviPointerList<KviNickServRule> * ll = rs->rules(); + for(KviNickServRule * rule = ll->first();rule;rule = ll->next()) + { + it = new QTreeWidgetItem(m_pNickServTreeWidget); + it->setText(0,rule->registeredNick()); + it->setText(1,rule->serverMask()); + it->setText(2,rule->nickServMask()); + it->setText(3,rule->messageRegexp()); + it->setText(4,rule->identifyCommand()); + } + } + + enableDisableNickServControls(); + + gl->setRowStretch(1,1); +} + +OptionsWidget_nickServ::~OptionsWidget_nickServ() +{ +} + +void OptionsWidget_nickServ::editNickServRule() +{ + QTreeWidgetItem * it = (QTreeWidgetItem *)m_pNickServTreeWidget->currentItem(); + if(!it)return; + KviNickServRule r(it->text(0),it->text(2),it->text(3),it->text(4),it->text(1)); + NickServRuleEditor ed(this,true); + if(ed.editRule(&r)) + { + it->setText(0,r.registeredNick()); + it->setText(1,r.serverMask()); + it->setText(2,r.nickServMask()); + it->setText(3,r.messageRegexp()); + it->setText(4,r.identifyCommand()); + } +} + +void OptionsWidget_nickServ::addNickServRule() +{ + KviNickServRule r; + NickServRuleEditor ed(this,true); + if(ed.editRule(&r)) + { + QTreeWidgetItem* it = new QTreeWidgetItem(m_pNickServTreeWidget); + it->setText(0,r.registeredNick()); + it->setText(1,r.serverMask()); + it->setText(2,r.nickServMask()); + it->setText(3,r.messageRegexp()); + it->setText(4,r.identifyCommand()); + } +} + +void OptionsWidget_nickServ::delNickServRule() +{ + QTreeWidgetItem * it = (QTreeWidgetItem *)m_pNickServTreeWidget->currentItem(); + if(!it)return; + delete it; + enableDisableNickServControls(); +} + +void OptionsWidget_nickServ::enableDisableNickServControls() +{ + bool bEnabled = m_pNickServCheck->isChecked(); + m_pNickServTreeWidget->setEnabled(bEnabled); + m_pAddRuleButton->setEnabled(bEnabled); + bEnabled = bEnabled && (m_pNickServTreeWidget->topLevelItemCount()) && m_pNickServTreeWidget->currentItem(); + m_pDelRuleButton->setEnabled(bEnabled); + m_pEditRuleButton->setEnabled(bEnabled); +} + +void OptionsWidget_nickServ::commit() +{ + g_pNickServRuleSet->clear(); + if(m_pNickServTreeWidget->topLevelItemCount()) + { + g_pNickServRuleSet->setEnabled(m_pNickServCheck->isChecked()); + QTreeWidgetItem * it;// = m_pNickServTreeWidget->firstChild(); + for (int i=0;i<m_pNickServTreeWidget->topLevelItemCount();i++) +// while(it) + { + it=(QTreeWidgetItem *)m_pNickServTreeWidget->topLevelItem(i); + g_pNickServRuleSet->addRule(KviNickServRule::createInstance(it->text(0),it->text(2),it->text(3),it->text(4),it->text(1))); + //it = it->nextSibling(); + } + } + KviOptionsWidget::commit(); +} + +#ifndef COMPILE_USE_STANDALONE_MOC_SOURCES +#include "m_OptionsWidget_nickserv.moc" +#endif //!COMPILE_USE_STANDALONE_MOC_SOURCES |
