示例#1
0
void MainParser::parse(const QCoreApplication& app)
{
    m_parser.process(app);

    int pos;
    bool ok;

    // server address

    QString serverAddress = m_parser.value(m_serverAddressOption);

    QString ipRange = "(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])";
    QRegExp ipRegex ("^" + ipRange
                     + "\\." + ipRange
                     + "\\." + ipRange
                     + "\\." + ipRange + "$");
    QRegExpValidator ipValidator(ipRegex);

    if (ipValidator.validate(serverAddress, pos) == QValidator::Acceptable) {
        m_serverAddress = serverAddress;
    } else {
        qWarning() << "MainParser::parse: server address invalid. Defaulting to " << m_serverAddress;
    }

    // server port

    QString serverPortStr = m_parser.value(m_serverPortOption);
    int serverPort = serverPortStr.toInt(&ok);

    if (ok && (serverPort > 1023) && (serverPort < 65536)) {
        m_serverPort = serverPort;
    } else {
        qWarning() << "MainParser::parse: server port invalid. Defaulting to " << m_serverPort;
    }
}
void addSiteDialog::on_pushButton_2_clicked()     //clicking on the "add site" button
{

    QString inputIpAddress=ui->lineEdit_2->text();
    bool noSubnetMask=ui->lineEdit_3->text().isEmpty();

    if ( (!ipValidator(inputIpAddress))  ||  (noSubnetMask) )    {
        QMessageBox::critical(this, tr("Invalid IP address"), tr("Invalid IPv4 address or subnet mask."));}
    //checking if the IP address and mask provided are valid

    else
    {

        QString inputSiteName=ui->lineEdit->text();
        QSqlQuery checkSiteName;
        checkSiteName.prepare(QString("select * from sites where UPPER(siteName)=UPPER('%1') AND vpnId=%2").arg(inputSiteName).arg(vpnId));

        if(checkSiteName.exec())
        {
            if (checkSiteName.next())
            {
                QMessageBox::critical(this, tr("Name already exists!"), tr("Cannot create SITE: name is alreay in use in this VPN."));
                qDebug()<<Q(QString("Site name %1 already used in vpn %2.").arg(inputSiteName,vpnName));
            }

            else
            {
                QSqlQuery newSiteQry;

                QSqlQuery getNextSiteId;
                getNextSiteId.exec("select nextId from nextId where idName='siteId'");

                bool exists=getNextSiteId.first();
                //qDebug()<<"exists="<<exists;

                unsigned int nextSiteId;
                QString updateSiteId;

                if(exists){nextSiteId=getNextSiteId.value(0).toUInt();
                    updateSiteId=QString("update nextId set nextId=%2 Where idName='siteId'").arg(nextSiteId+1);}
                else{nextSiteId=0;updateSiteId=QString("insert into nextId values('siteId',1)");}
                //si l'entrée siteId pour nextId n'existe pas dans la base de données (base de données vide)
                //on le crée au moment d'ajouter le nouveau SITE

                QString inputMask=ui->lineEdit_3->text();
                QString qryText=QString("insert into sites(vpnId,siteId,siteName,siteAddressRange) values(%1,%2,'%3','%4/%5')").arg(vpnId).arg(nextSiteId).arg(inputSiteName).arg(inputIpAddress).arg(inputMask);
                //qDebug()<<"qryText="<<qryText;
                //qDebug()<<"vpnId="<<vpnId;

                newSiteQry.prepare(qryText);

                //bool ok=getNextVpnId.exec(updateVpnId);

                QString rangeValidError;
                rangeValidError=addressRangeValidAvailable(networkIp, broadcastIp, vpnAddressRange, vpnId);

                bool    ok=(rangeValidError=="ok");

                if(ok){
                rangeValidError="";
                getNextSiteId.exec(updateSiteId);}



                if(ok){
                ok=newSiteQry.exec();}

                if(ok)
                {
                    QMessageBox::information(this, tr("site added"), tr("site added!"));
                    addrecent(vpnId);
                    emit addedSite();
                    this->close();

                    qDebug()<<Q(QString("Successfully added site %1 (%2/%3) to VPN %4.").arg(inputSiteName).arg(inputIpAddress).arg(inputMask).arg(vpnName));
                }
                else
                {
                    QString errorMessage="Site not added. Error: "+QString(newSiteQry.lastError().databaseText())+QString(getNextSiteId.lastError().databaseText())+rangeValidError;
                    QMessageBox::critical(this, tr("Site not added"), errorMessage);

                    qDebug()<<Q(errorMessage);
                }
            }
        }

    else
    {
        QMessageBox::critical(this, tr("Error"), tr("Couldn't check SITE availability, check database connection."));
    }
   }
}
///Maybe I'll organize the next part in classes or functions
void addVpnDialog::on_pushButton_2_clicked()     ///clicking on the "add VPN" button
{
    int vlanStart=ui->lineEdit_4->text().toInt();
    int vlanEnd=ui->lineEdit_5->text().toInt();
    QString inputIpAddress=ui->lineEdit_2->text();
    bool noSubnetMask=ui->lineEdit_3->text().isEmpty();

    while(true)
    {

        if ( (!ipValidator(inputIpAddress))  ||  (noSubnetMask) )  ///checking if the IP address and
        {                                                             /// mask provided are valid
            QMessageBox::critical(this, tr("Invalid IP address"), tr("Invalid IPv4 address or subnet mask."));
            break;
        }


        QString inputVpnName=ui->lineEdit->text();
        QString inputDescription=ui->plainTextEdit->toPlainText();
        QString inputMask=ui->lineEdit_3->text();
        QSqlQuery checkVpnName;
        checkVpnName.prepare(QString("select vpnName, vpnAddressRange, vlanRange, description from VPNs where UPPER(vpnName)=UPPER('%1')").arg(inputVpnName));
        ///this query checks whether the name is already taken, case insensitive
        ///this is redundant if the databse uses UNIQUE ids, maybe I'll remove it

        if(checkVpnName.exec())
        {


            if (checkVpnName.next())
            {
                QMessageBox::critical(this, tr("Name used!"), tr("Cannot create VPN: name is alreay in use."));
                qDebug()<<Q(QString("VPN name %1 is already in use (%2, %3, %4 ,\"%5\").").arg(inputVpnName,checkVpnName.value(0).toString(),checkVpnName.value(1).toString(),checkVpnName.value(2).toString(),checkVpnName.value(3).toString()));
                break;
            }

            qDebug()<<Q(QString("VPN Name %1 available").arg(inputVpnName));
            QSqlQuery newVpnQry;
            QSqlQuery getNextVpnId;

            getNextVpnId.exec("select nextId from nextId where idName='vpnId'");

            bool exists=getNextVpnId.first();
            unsigned int nextVpnId;
            QString updateVpnId;

            if(exists)
            {
                    nextVpnId=getNextVpnId.value(0).toUInt();
                    updateVpnId=QString("update nextId set nextId=%2 Where idName='vpnId'").arg(nextVpnId+1);
            }

            else

            {
                    nextVpnId=0;
                    updateVpnId=QString("insert into nextId values('vpnId',1)");
            }
            //si l'entrée vpnId pour nextId n'existe pas dans la base de données (base de données vide)
            //on le crée au moment d'ajouter le nouveau VPN


            rangeStart=qstringAddressToUint(networkIp);
            rangeEnd=qstringAddressToUint(broadcastIp);

            if(!vpnIpAvailable(rangeStart,rangeEnd))            ///check if the address range is not in use
            {
                QMessageBox::critical(this, tr("Address range in use!"), tr("address range used by another VPN"));
                qDebug()<<"VPN address range in use, view the above list for conflicting VPNs.";
                break;
            }

            qDebug()<<Q(QString("VPN address range %1/%2 available.").arg(inputIpAddress,inputMask));


            if(vlanStart>vlanEnd)                       ///check for valid VPN range entered
            {
                QMessageBox::critical(this, tr("Invalid VLAN range!"), tr("Invalid VLAN range"));
                qDebug()<<Q(QString("Invalid VLAN range entered"));
                break;
            }


            if(!vpnVlanAvailable(vlanStart,vlanEnd))         ///check if the vpn Range is available
            {
                QMessageBox::critical(this, tr("VLAN range in use!"), tr("VLAN range used by another VPN"));
                qDebug()<<Q(QString("VPN VLAN range in use, view the above list for conflicting VPNs."));
                break;
            }


            qDebug()<<"VPN address range available";



            bool ok=getNextVpnId.exec(updateVpnId);         ///update the nextVpnId table
            qDebug()<<"Updating database.";


            if (ok)                                         ///if successful update the vpnIpIntervals table
            {
                QString rangeQryText=QString("insert into vpnIpIntervals values(%1,%2,%3)").arg(rangeStart).arg(rangeEnd).arg(nextVpnId);
                ok=getNextVpnId.exec(rangeQryText);
            }

            if (ok)                                          ///if successful update the vpnVlanRanges table
            {
                //qDebug()<<"rangeintervals updated";
                QString vlanQryText=QString("insert into vpnVlanRanges values(%1,%2,%3)").arg(vlanStart).arg(vlanEnd).arg(nextVpnId);
                ok=getNextVpnId.exec(vlanQryText);

            }

            if (ok)                                          ///isert values into VPNs table
            {
                //qDebug()<<"VLANintervals updated";
                QString qryText=QString("insert into VPNs values(%1,'%2','%3','%4/%5','%6-%7')").arg(nextVpnId).arg(inputVpnName).arg(inputDescription).arg(inputIpAddress).arg(inputMask).arg(vlanStart).arg(vlanEnd);
                newVpnQry.prepare(qryText);
                ok=newVpnQry.exec();

            }

            if(ok)                                          ///successfully added VPN message
            {
                addrecent(nextVpnId);
                qDebug()<<Q(QString("Successfully added VPN %1 (address range: %2/%3, VLAN range: %4-%5) with description: \"%6\".").arg(inputVpnName).arg(inputIpAddress).arg(inputMask).arg(vlanStart).arg(vlanEnd).arg(inputDescription));
                QMessageBox::information(this, tr("VPN added"), tr("VPN added!"));
                emit addedVpn();
                this->close();
                break;
            }


                                        ///if (!ok) display the error message
            QString errorMessage="VPN not added: "+QString(newVpnQry.lastError().databaseText())+QString(getNextVpnId.lastError().databaseText());
            QMessageBox::critical(this, tr("VPN not added"), errorMessage);
            qDebug()<<errorMessage;
            break;

            //to implement:
            //not successful?-->rollback changes //db.exec("delete from VPNs where vpnId=%1"); //etc

        }

                        ///if couldn't check vpn name availability
        QMessageBox::critical(this, tr("Error"), tr("Couldn't check VPN availability, check database connection."));
        break;
   }
}