source: src-qt4/warden-gui/wizardNewJail.cpp @ 4302cc4

releng/10.0.1releng/10.0.2
Last change on this file since 4302cc4 was 4302cc4, checked in by JoshDW19 <joshms@…>, 5 months ago

Updated Warden to not accept invalid special characters (i.e !@#$) in hostnames.

  • Property mode set to 100644
File size: 8.6 KB
Line 
1/****************************************************************************
2** ui.h extension file, included from the uic-generated form implementation.
3**
4** If you want to add, delete, or rename functions or slots, use
5** Qt Designer to update this file, preserving your code.
6**
7** You should not define a constructor or destructor in this file.
8** Instead, write your code in functions called init() and destroy().
9** These will automatically be called by the form's constructor and
10** destructor.
11*****************************************************************************/
12#include "wizardNewJail.h"
13#include "pcbsd-utils.h"
14#include <QDebug>
15#include <QProcess>
16#include <QFileDialog>
17
18
19void wizardNewJail::programInit()
20{
21    // Connect our checks
22    connect(lineRoot, SIGNAL(textChanged ( const QString & )), this, SLOT(slotCheckComplete() ) );
23    connect(lineRoot2, SIGNAL(textChanged ( const QString & )), this, SLOT(slotCheckComplete() ) );
24    connect(lineIP, SIGNAL(textChanged ( const QString & )), this, SLOT(slotCheckComplete() ) );
25    connect(lineIP6, SIGNAL(textChanged ( const QString & )), this, SLOT(slotCheckComplete() ) );
26    connect(checkIPv4, SIGNAL(clicked()), this, SLOT(slotCheckChecks()));
27    connect(checkIPv6, SIGNAL(clicked()), this, SLOT(slotCheckChecks()));
28    connect(lineHost, SIGNAL(editingFinished( const QString & )), this, SLOT(slotCheckComplete() ) );
29    connect(lineLinuxScript, SIGNAL(textChanged ( const QString & )), this, SLOT(slotCheckComplete() ) );
30    connect(pushLinuxScript, SIGNAL(clicked()), this, SLOT(slotSelectLinuxScript()) );
31    connect(this, SIGNAL(currentIdChanged(int)), this, SLOT(slotCheckComplete()) );
32    loadTemplates();
33}
34
35void wizardNewJail::loadTemplates()
36{
37   comboTemplate->clear();
38   comboTemplate->addItem(tr("Use system version (default)"));
39   // Load any available templates
40   QProcess m;
41   m.start(QString("warden"), QStringList() << "template" << "list");
42   while(m.state() == QProcess::Starting || m.state() == QProcess::Running) {
43      m.waitForFinished(200);
44      QCoreApplication::processEvents();
45   }
46   int i = 0;
47   QString tmp;
48   while (m.canReadLine()) {
49     i++;
50     tmp = m.readLine().simplified();
51     // Skip first two header lines
52     if ( i > 2)
53       comboTemplate->addItem(tmp);
54   }
55}
56
57void wizardNewJail::slotCheckChecks()
58{
59   if ( checkIPv4->isChecked() )
60      lineIP->setEnabled(true);
61   else
62      lineIP->setEnabled(false);
63
64   if ( checkIPv6->isChecked() )
65      lineIP6->setEnabled(true);
66   else
67      lineIP6->setEnabled(false);
68
69   slotCheckComplete();
70}
71
72void wizardNewJail::setHostIPUsed(QStringList uH, QStringList uIP)
73{
74   usedHosts = uH;
75   usedIP = uIP;
76}
77
78void wizardNewJail::accept()
79{
80    QString ip4, ip6, tplate;
81    if ( checkIPv4->isChecked() )
82       ip4 = lineIP->text();
83    if ( checkIPv6->isChecked() )
84       ip6 = lineIP6->text();
85
86    if ( comboTemplate->currentIndex() != 0 )
87    tplate = comboTemplate->currentText().section(" ", 0, 0);
88   
89    emit create(ip4, ip6, lineHost->text(), radioTraditionalJail->isChecked(), checkPCBSDUtils->isChecked(),
90                lineRoot->text(), checkSystemSource->isChecked(), checkPortsTree->isChecked(),
91                checkAutostart->isChecked(), radioLinuxJail->isChecked(), lineLinuxScript->text(), tplate);
92    close();
93   
94}
95
96void wizardNewJail::slotClose()
97{
98  close();
99}
100
101// Logic checks to see if we are ready to move onto next page
102bool wizardNewJail::validatePage()
103{
104  QColor red = QColor(255, 78, 78);
105  QColor white = QColor(255, 255, 255);
106  QPalette badPal(red);
107  badPal.setColor(QPalette::Window,red);
108  badPal.setColor(QPalette::WindowText,red);
109  QPalette goodPal(white);
110  goodPal.setColor(QPalette::Window,white);
111  goodPal.setColor(QPalette::WindowText,white);
112  labelMessage->setText(QString());
113
114
115  switch (currentId()) {
116     case Page_IP:
117         // Make sure items are not empty.  Also check for invalid characters
118         if ( checkIPv4->isChecked() && lineIP->text().isEmpty() ) {
119            button(QWizard::NextButton)->setEnabled(false);
120            return false;
121         }
122         if ( checkIPv6->isChecked() && lineIP6->text().isEmpty() ) {
123            button(QWizard::NextButton)->setEnabled(false);
124            return false;
125         }
126         if ( lineHost->text().isEmpty() ) {
127            button(QWizard::NextButton)->setEnabled(false);
128            return false;
129         }
130         if ( lineHost->text().contains(" ") ) {
131            button(QWizard::NextButton)->setEnabled(false);
132            labelMessage->setText(tr("Hostname cannot contain spaces!"));
133            return false;
134         }
135         if ( lineHost->text().contains("~") || lineHost->text().contains("`") || lineHost->text().contains("!") || lineHost->text().contains("@") || lineHost->text().contains("#") || lineHost->text().contains("$") || lineHost->text().contains("%") || lineHost->text().contains("^") || lineHost->text().contains("&") || lineHost->text().contains("*") || lineHost->text().contains("(") || lineHost->text().contains(")") || lineHost->text().contains("_") || lineHost->text().contains("+") || lineHost->text().contains("=") || lineHost->text().contains(";") || lineHost->text().contains(":") || lineHost->text().contains("'") || lineHost->text().contains("|") || lineHost->text().contains("?") || lineHost->text().contains("<") || lineHost->text().contains(">") || lineHost->text().contains(".") || lineHost->text().contains("?") || lineHost->text().contains(",") ) {
136            button(QWizard::NextButton)->setEnabled(false);
137            labelMessage->setText(tr("Hostname cannot contain special characters!"));
138            return false;
139         }
140         // Check if this IP / Host is already used
141         for (int i = 0; i < usedHosts.size(); ++i) {
142            if ( usedHosts.at(i).toLower() == lineHost->text().toLower() ) {
143               button(QWizard::NextButton)->setEnabled(false);
144               lineHost->setPalette(badPal);
145               labelMessage->setText(tr("Hostname already used!"));
146               return false;
147            }
148         }
149         for (int i = 0; i < usedIP.size(); ++i)
150            if ( usedIP.at(i).contains(lineIP->text() + "/24") ) {
151               button(QWizard::NextButton)->setEnabled(false);
152               lineIP->setPalette(badPal);
153               labelMessage->setText(tr("IP already used!"));
154               return false;
155            }
156
157         // Check if we have a good IPV4 or IPV6 address
158         if ( checkIPv4->isChecked() && ! pcbsd::Utils::validateIPV4(lineIP->text())) {
159           button(QWizard::NextButton)->setEnabled(false);
160           lineIP->setPalette(badPal);
161           labelMessage->setText(tr("Invalid IP address!"));
162           return false;
163         }
164
165         if ( checkIPv6->isChecked() && ! pcbsd::Utils::validateIPV6(lineIP6->text()) ) {
166           button(QWizard::NextButton)->setEnabled(false);
167           lineIP6->setPalette(badPal);
168           labelMessage->setText(tr("Invalid IPv6 address!"));
169           return false;
170         }
171
172
173         // Got to the end, must be good!
174         lineIP->setPalette(goodPal);
175         lineHost->setPalette(goodPal);
176         button(QWizard::NextButton)->setEnabled(true);
177         return true;
178     case Page_Root:
179         if ( lineRoot->text() != lineRoot2->text() ) {
180           button(QWizard::NextButton)->setEnabled(false);
181           return false;
182         } else {
183           button(QWizard::NextButton)->setEnabled(true);
184         }
185         return true;
186     case Page_Linux:
187          if ( lineLinuxScript->text().isEmpty() ) {
188            button(QWizard::NextButton)->setEnabled(false);
189            return false;
190          }
191     default:
192         button(QWizard::NextButton)->setEnabled(true);
193         return true;
194  }
195
196  return true;
197}
198
199int wizardNewJail::nextId() const
200{
201  switch (currentId()) {
202     case Page_Type:
203         if (radioPortsJail->isChecked())
204           return Page_Opts;
205       break;
206       case Page_Root:
207         checkSystemSource->setHidden(false); 
208         checkPortsTree->setHidden(false); 
209         if (radioLinuxJail->isChecked()) {
210           labelConfirm->setText(tr("Please take a moment and set any other options for this jail."));
211           return Page_Linux;
212         } else {
213           return Page_Opts;
214         }
215       break;
216       case Page_Linux:
217           checkSystemSource->setHidden(true); 
218           checkPortsTree->setHidden(true); 
219           return Page_Opts;
220       break;
221       case Page_Opts:
222         return -1;
223       break;
224     default:
225        return currentId() + 1;
226  }
227  return currentId() + 1;
228}
229
230void wizardNewJail::slotCheckComplete()
231{
232   // Validate this page
233   validatePage();
234}
235
236void wizardNewJail::slotSelectLinuxScript()
237{
238   lineLinuxScript->setText(QFileDialog::getOpenFileName(this,
239   tr("Select Script"), "/usr/local/share/warden/linux-installs", tr("Linux install files (*)")));
240}
241
242
Note: See TracBrowser for help on using the repository browser.