[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[vidalia-svn] r2450: * Added validation of target column(localhost, internet-adre (vidalia/branches/hidden-services/src/vidalia/config)
Author: borkdomenik
Date: 2008-03-23 15:04:38 -0400 (Sun, 23 Mar 2008)
New Revision: 2450
Modified:
vidalia/branches/hidden-services/src/vidalia/config/servicepage.cpp
vidalia/branches/hidden-services/src/vidalia/config/servicepage.h
Log:
* Added validation of target column(localhost, internet-adresses now allowed)
* If validation of an user input fails, the value is set to the value the cell had before
Modified: vidalia/branches/hidden-services/src/vidalia/config/servicepage.cpp
===================================================================
--- vidalia/branches/hidden-services/src/vidalia/config/servicepage.cpp 2008-03-23 17:59:21 UTC (rev 2449)
+++ vidalia/branches/hidden-services/src/vidalia/config/servicepage.cpp 2008-03-23 19:04:38 UTC (rev 2450)
@@ -19,8 +19,8 @@
#include "ipvalidator.h"
#include "service.h"
#include "servicelist.h"
-/** TODO
- * size of the window expanding */
+#include "domainvalidator.h"
+#include "ipvalidator.h"
/** Constructor */
ServicePage::ServicePage(QWidget *parent)
@@ -314,7 +314,16 @@
tempService.setServiceAddress(hostname);
}
}
- QTableWidgetItem *serviceDir = new QTableWidgetItem(tempService.serviceDirectory(),0);
+ addressitem->setData(32, addressitem->text());
+ QTableWidgetItem *serviceDir =
+ new QTableWidgetItem(tempService.serviceDirectory(), 0);
+ serviceDir->setData(32, tempService.serviceDirectory());
+ QTableWidgetItem* virtualportitem =
+ new QTableWidgetItem(tempService.virtualPort(), 0);
+ virtualportitem->setData(32, tempService.virtualPort());
+ QTableWidgetItem* targetitem =
+ new QTableWidgetItem(tempService.physicalAddressPort(),0);
+ targetitem->setData(32, tempService.physicalAddressPort());
if(tempService.enabled()) {
cboxitem->setCheckState(Qt::Checked);
serviceDir->setFlags(Qt::ItemIsSelectable);
@@ -323,8 +332,8 @@
}
cboxitem->setTextAlignment(Qt::AlignCenter);
ui.serviceWidget->setItem(index, 0, addressitem);
- ui.serviceWidget->setItem(index, 1, new QTableWidgetItem(tempService.virtualPort(),0));
- ui.serviceWidget->setItem(index, 2, new QTableWidgetItem(tempService.physicalAddressPort(),0));
+ ui.serviceWidget->setItem(index, 1, virtualportitem);
+ ui.serviceWidget->setItem(index, 2, targetitem);
ui.serviceWidget->setItem(index, 3, serviceDir);
ui.serviceWidget->setItem(index, 4, cboxitem);
index++;
@@ -337,6 +346,7 @@
ServicePage::addService()
{
int rows = ui.serviceWidget->rowCount();
+ VMessageBox::warning(this, tr("Error"), QString::number(_services->size()), VMessageBox::Ok);
ui.serviceWidget->insertRow(rows);
QTableWidgetItem *address = new QTableWidgetItem("[Created by Tor]");
address->setFlags(Qt::ItemIsSelectable);
@@ -385,7 +395,7 @@
{
int selrow = ui.serviceWidget->currentRow();
if(selrow < 0 || selrow >= _services->size()) {
- VMessageBox::warning(this, tr("Error"), tr("Please select a Service."), VMessageBox::Ok);
+ VMessageBox::warning(this, tr("Error"), tr("Please select a Service."), VMessageBox::Ok);
return;
} else {
QString onionAddress = ui.serviceWidget->item(selrow,0)->text();
@@ -451,9 +461,34 @@
item->setCheckState(Qt::Unchecked);
service.setEnabled(false);
} else {
- item->setCheckState(Qt::Checked);
- service.setEnabled(true);
+ // check if directory is unique
+ bool unique = true;
+ QString dir = ui.serviceWidget->item(currentRow, 3)->text();
+ for (int index = 0; index < ui.serviceWidget->rowCount(); index++) {
+ // skip own row and non-enabled services
+ if(index == currentRow ||
+ ui.serviceWidget->item(index, 4)->checkState() == Qt::Unchecked) {
+ continue;
+ }
+ QTableWidgetItem* compareWith = ui.serviceWidget->item(index, 3);
+ if(compareWith != NULL) {
+ QString actualDir = compareWith->text();
+ if(actualDir.length() > 0 && dir.compare(actualDir) == 0) {
+ // service directory already in use
+ VMessageBox::warning(this, tr("Error"),
+ tr("Directory already in use by another enabled service."),
+ VMessageBox::Ok);
+ unique = false;
+ break;
+ }
+ }
}
+ // if directory is unique, change state
+ if (unique == true) {
+ item->setCheckState(Qt::Checked);
+ service.setEnabled(true);
+ }
+ }
_services->insert(currentRow, service);
}
}
@@ -464,70 +499,88 @@
ServicePage::valueChanged()
{
int pos = 0;
- QIntValidator* v = new QIntValidator(1,65535, this);
- IPValidator* vip = new IPValidator(this);
- int currentRow = ui.serviceWidget->currentRow();
- if(ui.serviceWidget->currentColumn() == 3) {
- QString eingabe = ui.serviceWidget->item(currentRow,3)->text();
- if(eingabe.length() > 0) {
- int index = 0;
- while(index < ui.serviceWidget->rowCount()) {
- if(index != currentRow) {
- QTableWidgetItem* item = ui.serviceWidget->item(index,3);
- if(item != NULL) {
- QString actualDir = item->text();
- if(actualDir.length() > 0 && eingabe.compare(actualDir) == 0) {
- //data directory already in use
- ui.serviceWidget->item(currentRow,3)->setText("");
- VMessageBox::warning(this, tr("Error"), tr("Directory already in use."), VMessageBox::Ok);
- break;
- }
- }
- }
- index++;
- }
- }
- /* TODO validation needs to accept <domain-name-or-ip-address>:<port>,
- * <domain-name-or-ip-address>, and <port>;
- } else if(ui.serviceWidget->currentColumn() == 2) {
- QTableWidgetItem* item = ui.serviceWidget->item(currentRow,2);
- if(item != NULL) {
- QString eingabe = item->text();
- if(eingabe.length() > 0) {
- if(eingabe.contains(":")) {
- QStringList strList = eingabe.split(":");
- QString ip = strList.first();
- strList.removeFirst();
- QString port = strList.first();
- if((vip->validate(ip) != QValidator::Acceptable) || (v->validate(port, pos) != QValidator::Acceptable)) {
- //incorrect data
- ui.serviceWidget->item(currentRow,2)->setText("");
- VMessageBox::warning(this, tr("Error"), tr("Only [IP-Address:Port] accepted here."), VMessageBox::Ok);
- }
- } else {
- ui.serviceWidget->item(currentRow,2)->setText("");
- VMessageBox::warning(this, tr("Error"), tr("Only [IP-Address:Port] accepted here."), VMessageBox::Ok);
- }
- }
- }
- */
- } else if(ui.serviceWidget->currentColumn() == 1) {
- QString eingabe = ui.serviceWidget->item(currentRow,1)->text();
- if(eingabe.length() > 0) {
- if(v->validate(eingabe,pos) != QValidator::Acceptable) {
- //incorrect data
- ui.serviceWidget->item(currentRow,1)->setText("");
- VMessageBox::warning(this, tr("Error"), tr("Only valid port numbers allowed [1..65535]."), VMessageBox::Ok);
- }
- }
- }
+ QIntValidator* portValidator = new QIntValidator(1, 65535, this);
+ DomainValidator* domainValidator = new DomainValidator(this);
+ IPValidator* ipValidator = new IPValidator(this);
+ QTableWidgetItem* item = ui.serviceWidget->currentItem();
+ if (item == NULL || item->text() == NULL || item->text().length() == 0) {
+ // nothing to validate here
+ return;
+ }
+ QString text = item->text();
+ switch (item->column()) {
+ case 1: // virtual port
+ if(portValidator->validate(text, pos) == QValidator::Acceptable) {
+ // correct data; buffer value in user role 32
+ item->setData(32, text);
+ } else {
+ //incorrect data; restore value from user role 32
+ VMessageBox::warning(this, tr("Error"),
+ tr("Virtual Port may only contain valid port numbers [1..65535]."),
+ VMessageBox::Ok);
+ item->setText(item->data(32).toString());
+ }
+ break;
+ case 2: // target
+ if(text.contains(":")) {
+ // check for <address>:<port>
+ QStringList strList = text.split(":");
+ if (strList.size() != 2) {
+ goto invalid;
+ }
+ QString address = strList.at(0);
+ QString port = strList.at(1);
+ if((address.compare("localhost") != 0 &&
+ ipValidator->validate(address, pos) != QValidator::Acceptable &&
+ domainValidator->validate(address, pos) != QValidator::Acceptable) ||
+ portValidator->validate(port, pos) != QValidator::Acceptable) {
+ goto invalid;
+ }
+ } else { // either <address> or <port>
+ if (text.compare("localhost") != 0 &&
+ ipValidator->validate(text, pos) != QValidator::Acceptable &&
+ domainValidator->validate(text, pos) != QValidator::Acceptable &&
+ portValidator->validate(text, pos) != QValidator::Acceptable) {
+ goto invalid;
+ }
+ }
+ goto valid;
+ invalid:
+ VMessageBox::warning(this, tr("Error"),
+ tr("Target may only contain address:port, address, or port."),
+ VMessageBox::Ok);
+ item->setText(item->data(32).toString());
+ break;
+ valid:
+ item->setData(32, text);
+ break;
+ case 3: // service directory
+ // only check whether directory is unique if this service is enabled
+ if (!_services->value(item->row()).enabled()) {
+ return;
+ }
+ // compare with directories of other enabled services
+ for (int index = 0; index < ui.serviceWidget->rowCount(); index++) {
+ // skip own row and non-enabled services
+ if(index == item->row() || !_services->value(index).enabled()) {
+ continue;
+ }
+ QTableWidgetItem* compareWith = ui.serviceWidget->item(index, 3);
+ if(compareWith != NULL) {
+ QString actualDir = compareWith->text();
+ if(actualDir.length() > 0 && text.compare(actualDir) == 0) {
+ // service directory already in use
+ VMessageBox::warning(this, tr("Error"),
+ tr("Directory already in use by another enabled service."),
+ VMessageBox::Ok);
+ item->setText(item->data(32).toString());
+ return;
+ }
+ }
+ }
+ // correct data; buffer value in user role 32
+ item->setData(32, text);
+ break;
+ }
}
-/** Called when a link in a label is clicked. <b>url</b> is the target of
- * the clicked link. */
-void
-ServicePage::onLinkActivated(const QString &url)
-{
- emit helpRequested(url);
-}
-
Modified: vidalia/branches/hidden-services/src/vidalia/config/servicepage.h
===================================================================
--- vidalia/branches/hidden-services/src/vidalia/config/servicepage.h 2008-03-23 17:59:21 UTC (rev 2449)
+++ vidalia/branches/hidden-services/src/vidalia/config/servicepage.h 2008-03-23 19:04:38 UTC (rev 2450)
@@ -61,9 +61,7 @@
void valueChanged();
- void onLinkActivated(const QString &url);
-
private:
/** A TorControl object used to talk to Tor. */
TorControl* _torControl;