[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;