00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <QFile>
00029 #include <QFileInfo>
00030 #include <gui/common/vmessagebox.h>
00031 #include <util/file.h>
00032 #include <vidalia.h>
00033 #include "advancedpage.h"
00034
00035 #if defined(Q_WS_WIN)
00036 #include <control/torservice.h>
00037 #endif
00038
00039
00040
00041 AdvancedPage::AdvancedPage(QWidget *parent)
00042 : ConfigPage(parent)
00043 {
00044
00045 ui.setupUi(this);
00046
00047
00048 _settings = new TorSettings();
00049
00050
00051 connect(ui.btnBrowseTorConfig, SIGNAL(clicked()), this, SLOT(browseTorConfig()));
00052
00053
00054 #if defined(Q_WS_WIN)
00055 ui.grpPermissions->setVisible(false);
00056 ui.grpService->setVisible(TorService::isSupported());
00057 #endif
00058 }
00059
00060
00061 AdvancedPage::~AdvancedPage()
00062 {
00063 delete _settings;
00064 }
00065
00066
00067 bool
00068 AdvancedPage::save(QString &errmsg)
00069 {
00070 Q_UNUSED(errmsg);
00071 _settings->setControlPort(ui.lineControlPort->text().toUShort());
00072 _settings->setTorrc(ui.lineTorConfig->text());
00073 _settings->setUser(ui.lineUser->text());
00074 _settings->setGroup(ui.lineGroup->text());
00075
00076 #if defined(Q_WS_WIN)
00077
00078 setupService();
00079 #endif
00080
00081 return true;
00082 }
00083
00084
00085 void
00086 AdvancedPage::load()
00087 {
00088 ui.lineControlPort->setText(QString::number(_settings->getControlPort()));
00089 ui.lineTorConfig->setText(_settings->getTorrc());
00090 ui.lineUser->setText(_settings->getUser());
00091 ui.lineGroup->setText(_settings->getGroup());
00092
00093 #if defined(Q_WS_WIN)
00094 ui.chkUseService->setChecked(useService());
00095 #endif
00096 }
00097
00098
00099
00100
00101 void
00102 AdvancedPage::browseTorConfig()
00103 {
00104
00105 QString filename = QFileDialog::getOpenFileName(this,
00106 tr("Select Tor Configuration File"),
00107 QFileInfo(ui.lineTorConfig->text()).fileName());
00108
00109
00110 if (filename.isEmpty()) {
00111 return;
00112 }
00113
00114
00115 QFile torrcFile(filename);
00116 if (!QFileInfo(filename).exists()) {
00117
00118 int response = VMessageBox::question(this,
00119 tr("File Not Found"),
00120 tr("%1 does not exist. Would you like to create it?")
00121 .arg(filename),
00122 VMessageBox::Yes, VMessageBox::No);
00123
00124 if (response == VMessageBox::No) {
00125
00126 return;
00127 }
00128
00129 QString errmsg;
00130 if (!touch_file(filename, false, &errmsg)) {
00131 VMessageBox::warning(this,
00132 tr("Failed to Create File"),
00133 tr("Unable to create %1 [%2]").arg(filename)
00134 .arg(errmsg),
00135 VMessageBox::Ok);
00136 return;
00137 }
00138 }
00139 ui.lineTorConfig->setText(filename);
00140 }
00141
00142 #if defined(Q_WS_WIN)
00143
00144 bool
00145 AdvancedPage::useService()
00146 {
00147 bool use = false;
00148
00149
00150
00151
00152
00153 if (_settings->getUseService()) {
00154 TorService* s = new TorService(_settings->getExecutable(),
00155 _settings->getTorrc());
00156 use = s->isInstalled();
00157 delete s;
00158
00159
00160 if (!use) _settings->setUseService(false);
00161 }
00162 return use;
00163 }
00164
00165
00166 void
00167 AdvancedPage::setupService()
00168 {
00169 bool checked = ui.chkUseService->isChecked();
00170 TorService* s = new TorService(_settings->getExecutable(),
00171 _settings->getTorrc());
00172
00173 if (!checked && s->isInstalled()) {
00174
00175 Vidalia::torControl()->stop();
00176
00177 if (!s->remove()) {
00178 VMessageBox::critical(this,
00179 tr("Unable to remove Tor Service"),
00180 tr("Vidalia was unable to remove the Tor service.\n\n"
00181 "You may need to remove it manually."),
00182 VMessageBox::Ok, VMessageBox::Cancel);
00183 }
00184 _settings->setUseService(false);
00185
00186 } else if (checked && !s->isInstalled()) {
00187
00188 if (!s->install()) {
00189 VMessageBox::critical(this,
00190 tr("Unable to install Tor Service"),
00191 tr("Vidalia was unable to install the Tor service."),
00192 VMessageBox::Ok, VMessageBox::Cancel);
00193 }
00194 _settings->setUseService(s->isInstalled());
00195 } else {
00196 _settings->setUseService(checked);
00197 }
00198
00199 delete s;
00200 }
00201 #endif
00202