42 ui.serviceWidget->horizontalHeader()->resizeSection(0, 150);
43 ui.serviceWidget->horizontalHeader()->resizeSection(1, 89);
44 ui.serviceWidget->horizontalHeader()->resizeSection(2, 100);
45 ui.serviceWidget->horizontalHeader()->resizeSection(3, 120);
46 ui.serviceWidget->horizontalHeader()->resizeSection(4, 60);
47 ui.serviceWidget->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
48 ui.serviceWidget->horizontalHeader()->setResizeMode(1, QHeaderView::Stretch);
49 ui.serviceWidget->horizontalHeader()->setResizeMode(2, QHeaderView::Stretch);
50 ui.serviceWidget->horizontalHeader()->setResizeMode(3, QHeaderView::Stretch);
51 ui.serviceWidget->verticalHeader()->hide();
57 connect(
ui.serviceWidget, SIGNAL(itemClicked(QTableWidgetItem*)),
59 connect(
ui.serviceWidget, SIGNAL(itemChanged(QTableWidgetItem*)),
74 ui.retranslateUi(
this);
82 QList<Service> serviceList;
83 QList<Service> publishedServices;
86 while(index < ui.serviceWidget->rowCount()) {
87 QString address =
ui.serviceWidget->item(index,0)->text();
88 QString virtualPort =
ui.serviceWidget->item(index,1)->text();
89 QString physicalAddress =
ui.serviceWidget->item(index,2)->text();
90 QString directoryPath =
ui.serviceWidget->item(index,3)->text();
91 bool enabled =
_services->value(index).enabled();
92 Service temp(address, virtualPort, physicalAddress, directoryPath,
95 _services->value(
ui.serviceWidget->currentRow()).additionalServiceOptions());
96 serviceList.push_back(temp);
98 publishedServices.push_back(temp);
106 if(serviceList.size() > 0) {
113 if(publishedServices.size() > 0) {
116 QString errmsg1 = tr(
"Error while trying to unpublish all services");
117 QString &errmsg = errmsg1;
122 errmsg = tr(
"Please configure at least a service directory and a virtual "
123 "port for each service you want to save. Remove the other ones.");
134 foreach(
Service s, serviceList) {
148 QString serviceConfString;
149 QString errmsg =
"Error while trying to publish services.";
150 QListIterator<Service> it(services);
152 while(it.hasNext()) {
154 serviceConfString.append(
"hiddenservicedir=" +
156 serviceConfString.append(
"hiddenserviceport=" +
170 QList<Service> torServiceList;
172 ui.removeButton->setEnabled(
false);
173 ui.copyButton->setEnabled(
false);
174 ui.browseButton->setEnabled(
false);
181 QList<Service> completeList = torServiceList;
184 QList<Service> serviceSettingsList = serviceList.
services();
185 QListIterator<Service> it(serviceSettingsList);
187 while(it.hasNext()) {
190 completeList.push_back(temp);
194 QListIterator<Service> it2(completeList);
196 while (it2.hasNext()) {
197 Service tempService = it2.next();
210 QStringList strList = conf.split(
"250 HiddenServiceDir");
211 strList.removeFirst();
212 QListIterator<QString> it(strList);
214 while(it.hasNext()) {
215 QString temp = it.next();
226 QString additionalOptions = s;
228 int index = additionalOptions.indexOf(
"250",1);
229 additionalOptions.remove(0, index+4);
231 int startindex = additionalOptions.indexOf(
"hiddenserviceport", 0,
232 Qt::CaseInsensitive);
233 int endindex = additionalOptions.indexOf(
"250", startindex);
235 additionalOptions.remove(startindex, (endindex-startindex)+4);
237 while(additionalOptions.contains(
"250")) {
238 int i = additionalOptions.indexOf(
"250", 0);
239 additionalOptions.remove(
i, 4);
242 if (!additionalOptions.endsWith(
'\n')) {
243 additionalOptions.append(
"\n");
246 int j = additionalOptions.indexOf(
"=", 0);
248 additionalOptions.insert(j+1,
"\"");
249 int end = additionalOptions.indexOf(
"\n", j);
250 additionalOptions.insert(end,
"\"");
251 j = additionalOptions.indexOf(
"=", end);
254 additionalOptions.replace(QString(
"\n"), QString(
" "));
256 additionalOptions =
"";
259 QString address, virtualPort, physAddressPort, serviceDir;
261 QStringList strList = s.split(
"\n");
262 QString tempServiceDir = strList.first().trimmed();
263 serviceDir = tempServiceDir.remove(0, 1);
265 QStringList strList2 = s.split(
"HiddenServicePort");
266 strList2.removeFirst();
267 QStringList strList3 = strList2.first().split(
"\n");
268 QStringList strList4 = strList3.first().split(
" ");
269 if(strList4.size() > 0) {
270 QString tempVirtualPort = strList4.first();
271 virtualPort = tempVirtualPort.remove(0, 1);
272 strList4.removeFirst();
274 if(!strList4.isEmpty()) {
275 physAddressPort = strList4.first().trimmed();
278 QString tempVirtualPort = strList3.first();
279 virtualPort = tempVirtualPort.remove(0, 1);
282 QString serviceHostnameDir = serviceDir;
283 serviceHostnameDir.append(
"/");
284 serviceHostnameDir.append(
"hostname");
285 QFile file(serviceHostnameDir);
286 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
287 address =
"[Directory not found]";
289 QTextStream in(&file);
291 while (!in.atEnd()) {
292 hostname.append(in.readLine());
296 Service service(address, virtualPort, physAddressPort, serviceDir,
true);
306 QListIterator<Service> it(torServices);
307 while(it.hasNext()) {
322 int rows =
ui.serviceWidget->rowCount();
323 for(
int i = 0;
i < rows;
i++) {
324 ui.serviceWidget->removeRow(0);
328 while(index < services->size()) {
329 Service tempService = services->value(index);
330 ui.serviceWidget->insertRow(index);
331 QTableWidgetItem *cboxitem =
new QTableWidgetItem();
332 cboxitem->setFlags(Qt::ItemIsSelectable);
333 QTableWidgetItem *addressitem =
new QTableWidgetItem();
334 addressitem->setFlags(Qt::ItemIsSelectable);
339 serviceHostnameDir.append(
"/");
340 serviceHostnameDir.append(
"hostname");
341 QFile file(serviceHostnameDir);
342 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
343 addressitem->setText(
"[Directory not found]");
345 QTextStream in(&file);
347 while (!in.atEnd()) {
348 hostname.append(in.readLine());
350 addressitem->setText(hostname);
354 addressitem->setData(32, addressitem->text());
355 QTableWidgetItem *serviceDir =
358 QTableWidgetItem* virtualportitem =
359 new QTableWidgetItem(tempService.
virtualPort(), 0);
360 virtualportitem->setData(32, tempService.
virtualPort());
361 QTableWidgetItem* targetitem =
365 cboxitem->setCheckState(Qt::Checked);
366 serviceDir->setFlags(Qt::ItemIsSelectable);
368 cboxitem->setCheckState(Qt::Unchecked);
370 cboxitem->setTextAlignment(Qt::AlignCenter);
371 ui.serviceWidget->setItem(index, 0, addressitem);
372 ui.serviceWidget->setItem(index, 1, virtualportitem);
373 ui.serviceWidget->setItem(index, 2, targetitem);
374 ui.serviceWidget->setItem(index, 3, serviceDir);
375 ui.serviceWidget->setItem(index, 4, cboxitem);
385 int rows =
ui.serviceWidget->rowCount();
386 ui.serviceWidget->insertRow(rows);
387 QTableWidgetItem *address =
new QTableWidgetItem(
"["+tr(
"Created by Tor")+
"]");
388 address->setFlags(Qt::ItemIsSelectable);
389 QTableWidgetItem *dummy =
new QTableWidgetItem();
390 QTableWidgetItem *dummy2 =
new QTableWidgetItem();
391 QTableWidgetItem *dummy3 =
new QTableWidgetItem();
392 QTableWidgetItem *cboxitem =
new QTableWidgetItem();
393 cboxitem->setFlags(Qt::ItemIsSelectable);
394 cboxitem->setCheckState(Qt::Checked);
395 ui.serviceWidget->setItem(rows, 0, address);
396 ui.serviceWidget->setItem(rows, 1, dummy);
397 ui.serviceWidget->setItem(rows, 2, dummy2);
398 ui.serviceWidget->setItem(rows, 3, dummy3);
399 ui.serviceWidget->setItem(rows, 4, cboxitem);
410 int rows =
ui.serviceWidget->rowCount();
411 int selrow =
ui.serviceWidget->currentRow();
412 if(selrow < 0 || selrow >=
_services->size()) {
417 ui.serviceWidget->removeRow(selrow);
419 for(
int i = 0;
i < (rows-selrow-1);
i++) {
420 int index =
i+selrow;
433 int selrow =
ui.serviceWidget->currentRow();
434 if(selrow < 0 || selrow >=
_services->size()) {
439 QString onionAddress =
ui.serviceWidget->item(selrow,0)->text();
440 QClipboard *clipboard = QApplication::clipboard();
441 QString clipboardText;
442 QTableWidgetItem* selectedItem =
ui.serviceWidget->item(selrow,0);
443 clipboardText.append(selectedItem->text());
444 clipboard->setText(clipboardText);
453 int selrow =
ui.serviceWidget->currentRow();
454 if(selrow < 0 || selrow >=
_services->size()) {
460 QFileDialog::getExistingDirectory(
this,
461 tr(
"Select Service Directory"),
"",
462 QFileDialog::ShowDirsOnly
463 | QFileDialog::DontResolveSymlinks);
465 if (dirname.isEmpty()) {
468 ui.serviceWidget->item(selrow,3)->setText(dirname);
479 bool emptyTable =
false;
480 if(
ui.serviceWidget->rowCount() > 0) {
481 ui.removeButton->setEnabled(
true);
482 ui.copyButton->setEnabled(
true);
483 ui.browseButton->setEnabled(
true);
485 ui.removeButton->setEnabled(
false);
486 ui.copyButton->setEnabled(
false);
487 ui.browseButton->setEnabled(
false);
490 int currentRow =
ui.serviceWidget->currentRow();
491 if(emptyTable ==
false) {
492 QTableWidgetItem* item =
ui.serviceWidget->item(currentRow, 0);
494 bool b = item->text().contains(
".onion");
495 ui.copyButton->setEnabled(
b);
499 QString selDir =
_services->value(
ui.serviceWidget->currentRow()).
502 if(selDir.length() > 0) {
503 QListIterator<QString> it(strList);
504 while(it.hasNext()) {
505 QString temp = it.next();
506 if(selDir.compare(temp) == 0) {
507 ui.browseButton->setEnabled(
false);
513 if(
ui.serviceWidget->currentColumn() == 4) {
515 QTableWidgetItem* item =
ui.serviceWidget->item(currentRow,4);
517 item->setCheckState(Qt::Unchecked);
520 item->setCheckState(Qt::Checked);
533 QIntValidator* portValidator =
new QIntValidator(1, 65535,
this);
536 QTableWidgetItem* item =
ui.serviceWidget->currentItem();
537 if (item == NULL || item->text() == NULL || item->text().length() == 0) {
541 QString text = item->text();
542 switch (item->column()) {
544 if(portValidator->validate(text, pos) == QValidator::Acceptable) {
546 item->setData(32, text);
550 tr(
"Virtual Port may only contain valid port numbers [1..65535]."),
552 item->setText(item->data(32).toString());
556 if(text.contains(
":")) {
558 QStringList strList = text.split(
":");
559 if (strList.size() != 2) {
562 QString address = strList.at(0);
563 QString port = strList.at(1);
564 if((address.compare(
"localhost") != 0 &&
565 ipValidator->
validate(address, pos) != QValidator::Acceptable &&
566 domainValidator->validate(address, pos) != QValidator::Acceptable) ||
567 portValidator->validate(port, pos) != QValidator::Acceptable) {
571 if (text.compare(
"localhost") != 0 &&
572 ipValidator->
validate(text, pos) != QValidator::Acceptable &&
573 domainValidator->validate(text, pos) != QValidator::Acceptable &&
574 portValidator->validate(text, pos) != QValidator::Acceptable) {
581 tr(
"Target may only contain address:port, address, or port."),
583 item->setText(item->data(32).toString());
586 item->setData(32, text);
590 for (
int index = 0; index <
ui.serviceWidget->rowCount(); index++) {
592 if(index == item->row()) {
595 QTableWidgetItem* compareWith =
ui.serviceWidget->item(index, 3);
596 if(compareWith != NULL) {
597 QString actualDir = compareWith->text();
598 if(actualDir.length() > 0 && text.compare(actualDir) == 0) {
601 tr(
"Directory already in use by another service."),
603 item->setText(item->data(32).toString());
609 item->setData(32, text);
stop errmsg connect(const QHostAddress &address, quint16 port)
QValidator::State validate(QString &input) const
QString virtualPort() const
void setAdditionalServiceOptions(QString options)
void setEnabled(bool enabled)
QString physicalAddressPort() const
void setServiceAddress(QString serviceAddress)
void setServiceDirectory(QString serviceDirectory)
QString serviceDirectory() const
QString additionalServiceOptions() const
QString serviceAddress() const
QList< Service > services() const
void setServices(QList< Service > services)
bool save(QString &errmsg)
virtual void retranslateUi()
void initServiceTable(QMap< int, Service > *_services)
bool isServicePublished(Service service, QList< Service > torServices)
QMap< int, Service > * _services
Service generateService(QString serviceString)
bool checkBeforeSaving(QList< Service > services)
QMap< QString, Service > * _torServices
void startServicesInTor(QList< Service > services)
ServicePage(QWidget *parent=0)
QList< Service > extractSingleServices(QString conf)
void serviceSelectionChanged()
void setServices(ServiceList services)
void applyServices(QString value, QString *errmsg)
ServiceList getServices()
void unpublishAllServices(QString *errmsg)
QString getHiddenServiceDirectories()
static int warning(QWidget *parent, QString caption, QString text, int button0, int button1=NoButton, int button2=NoButton)
static TorControl * torControl()
QString string_escape(const QString &str)