//============================================================================= // // 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 option) 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 #include #include #include #include // 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 = "
"; QString html_center_end = "
"; 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 NickServ!service@services.dalnet.
" \ "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 NickServ!*@* 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,1,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.
" \ "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 msg NickServ identify <yourpassword>.
" \ "You can use msg -q 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.
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!
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!
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 ") : 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("
This is a list of NickServ identification rules. " \ "KVIrc will use them to model its automatic interaction with NickServ on all the networks.
" \ "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.
" \ "In other words, be sure to know what you're doing.
" \ "Also note that the password that you provide is stored as PLAIN TEXT.
" \ "KVIrc supports also per-network NickServ authentication rules that can be " \ "created in the \"Advanced...\" network options (accessible from the servers dialog)." "
","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 * 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;itopLevelItemCount();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(); }